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

来源:互联网 发布:软件开发费用标准 编辑:程序博客网 时间:2024/04/28 10:51

一般在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来解析。

0 0
原创粉丝点击