Spring MVC中解决中文乱码问题时useBodyEncodingForURI="true"的作用

一般在web.xml文件中作如下配置:
其作用是,当forceEncoding为false的前提下(默认为false),当request没有指定content-type或content-type不含编码时,该filter将会为这个request设定请求体的编码为filter的encoding值。
当forceEncoding为true的前提下,就会为request的请求体和response都设定为这个filter的encoding值。

<filter>  
    <filter-name>CharacterEncoding</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <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>CharacterEncoding</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  

CharacterEncodingFilter类的源代码如下:

public class CharacterEncodingFilter extends OncePerRequestFilter {  

    private String encoding;  

    private boolean forceEncoding = false;  


    /** 
     * Set the encoding to use for requests. This encoding will be passed into a 
     * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call. 
     * <p>Whether this encoding will override existing request encodings 
     * (and whether it will be applied as default response encoding as well) 
     * depends on the {@link #setForceEncoding "forceEncoding"} flag. 
     */  
    public void setEncoding(String encoding) {  
        this.encoding = encoding;  
    }  

    /** 
     * Set whether the configured {@link #setEncoding encoding} of this filter 
     * is supposed to override existing request and response encodings. 
     * <p>Default is "false", i.e. do not modify the encoding if 
     * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()} 
     * returns a non-null value. Switch this to "true" to enforce the specified 
     * encoding in any case, applying it as default response encoding as well. 
     * <p>Note that the response encoding will only be set on Servlet 2.4+ 
     * containers, since Servlet 2.3 did not provide a facility for setting 
     * a default response encoding. 
     */  
    public void setForceEncoding(boolean forceEncoding) {  
        this.forceEncoding = forceEncoding;  
    }  


    @Override  
    protected void doFilterInternal(  
            HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)  
            throws ServletException, IOException {  

        if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {  
            request.setCharacterEncoding(this.encoding);  
            if (this.forceEncoding) {  
                response.setCharacterEncoding(this.encoding);  
            }  
        }  
        filterChain.doFilter(request, response);  
    }  

}  

这个filter有两个属性,encoding和forceEncoding,我们可以在web.xml文件中来设定这两个属性值。
每次request请求到来执行方法doFilterInternal,首先调用request.getCharacterEncoding(),本质就是从请求header content-type中获取编码值,如果没有,则调用request.setCharacterEncoding(this.encoding)将该filter的encoding值设置为请求体的编码方式,记住该编码方式只对请求体,不针对请求参数。当forceEncoding=true时,不管请求header content-type有没有编码方式,始终将该filter的encoding值设置到request和response中,同样只针对request的请求体。

但这个设置是针对POST请求的,tomacat对GET和POST请求处理方式是不同的,要处理针对GET请求的编码问题,则需要改tomcat的server.xml配置文件,如下:

将下面的代码:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>  

修改为:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>  

useBodyEncodingForURI=true是说,请求参数的编码方式要采用请求体的编码方式。当useBodyEncodingForURI=true时,若请求体采用utf-8解析,则请求参数也要采用utf-8来解析。

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页