zoukankan      html  css  js  c++  java
  • Spring乱码问题解决方案

    请求乱码

    GET请求乱码:

    原因:请求参数带在url地址上、url地址什么时候解析?
    tomcat收到请求对url进行编解码(ISO8859-1)
    解决方案:在tomcat的8080端口配置出加上 URIEncoding="utf-8";
    <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

    POST请求乱码:

     原因:请求参数是带在请求体
     请求体的解码是在第一次获取参数的时候
     filter可以用来解决乱码
     request.setCharacterEncoding("utf-8")
     

     响应乱码

     response.setContentType("text/html;charset=utf-8")
     
     1、tomcat一安装;上手就给server.xml中的8080处加上URIEncoding="utf-8"
     2、给项目里面再搞一个filter让他来解决所有的post乱码;
     3、SpringMVC自带的一个乱码解决的filter
    项目的web.xml中配置:
    <!--字符编码的filter一定要放在最前面  -->
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <!-- 配置encoding,告诉我们指定的编码格式 -->
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
            <!-- 解决响应乱码 -->
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        <!-- 支持rest的filter -->
        <filter>
            <filter-name>HiddenHttpMethodFilter</filter-name>
            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>HiddenHttpMethodFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    在配置里面配置了encoding和forceEncoding
    来看看CharacterEncodingFilter的源码,通过request.setCharacterEncoding(this.encoding)和response.setCharacterEncoding(this.encoding)来解决post请求和响应乱码的问题:
    public class CharacterEncodingFilter extends OncePerRequestFilter {
    
        private String encoding;
    
        private boolean forceEncoding = false;
    
        public void setEncoding(String encoding) {
            this.encoding = encoding;
        }
    
        public void setForceEncoding(boolean forceEncoding) {
            this.forceEncoding = forceEncoding;
        }
    
    
        @Override
        protected void doFilterInternal(
                HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {
            //encoding是UTF-8
            //forceEncoding位true
            if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
                request.setCharacterEncoding(this.encoding);
                if (this.forceEncoding) {
                    response.setCharacterEncoding(this.encoding);
                }
            }
            filterChain.doFilter(request, response);
        }
    
    }

     

  • 相关阅读:
    基于Kalman filter 的北斗卫星三维坐标后数据处理
    原子串口使用0D0A结尾作为结束字符
    GY90614 读取温度,修改辐射率,拟合曲线
    CRH PC11配置
    _I2C_SDA_READ 状态确定为输入
    read_byte
    SDA 右移赋值
    积极心态-刚入职的我们
    mysql基础知识点(复习一)
    java基础知识点(复习一)
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/7368346.html
Copyright © 2011-2022 走看看