• Spring 配置请求过滤器,编码格式设为UTF-8,避免中文乱码


     1 <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码-->
     2     <filter>
     3        <filter-name>springUtf8Encoding</filter-name>
     4        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     5        <init-param>
     6            <param-name>encoding</param-name>
     7            <param-value>UTF-8</param-value>
     8        </init-param>
     9        <init-param>
    10            <param-name>forceEncoding</param-name>
    11            <param-value>true</param-value>
    12        </init-param> 
    13     </filter>
    14     <filter-mapping>
    15        <filter-name>springUtf8Encoding</filter-name>
    16        <url-pattern>/*</url-pattern>
    17    </filter-mapping>

    注解配置:

    @Bean
    CharacterEncodingFilter characterEncodingFilter(){
    	CharacterEncodingFilter filter = new CharacterEncodingFilter();
    	filter.setEncoding("UTF-8");
    	filter.setForceEncoding(true);
    	return filter;
    }

    spring源码

     1 public class CharacterEncodingFilterextends OncePerRequestFilter {
     2  
     3     private String encoding;
     4  
     5     private boolean forceEncoding = false;
     6  
     7  
     8     /**
     9      * Set the encoding to usefor requests. This encoding will be passed into a
    10      * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call.
    11      * <p>Whether this encoding will overrideexisting request encodings
    12      * (and whether it will beapplied as default response encoding as well)
    13      * depends on the {@link #setForceEncoding "forceEncoding"} flag.
    14      */
    15     public void setEncoding(String encoding) {
    16        this.encoding = encoding;
    17     }
    18  
    19     /**
    20      * Set whether theconfigured {@link #setEncoding encoding} of this filter
    21      * is supposed to overrideexisting request and response encodings.
    22      * <p>Default is "false", i.e. do notmodify the encoding if
    23      * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()}
    24      * returns a non-null value.Switch this to "true" to enforce the specified
    25      * encoding in any case,applying it as default response encoding as well.
    26      * <p>Note that the response encoding will onlybe set on Servlet 2.4+
    27      * containers, sinceServlet 2.3 did not provide a facility for setting
    28      * a default responseencoding.
    29      */
    30     public void setForceEncoding(boolean forceEncoding) {
    31        this.forceEncoding = forceEncoding;
    32     }
    33  
    34  
    35     @Override
    36     protected void doFilterInternal(
    37            HttpServletRequest request, HttpServletResponse response,FilterChain filterChain)
    38            throws ServletException, IOException {
    39  
    40        if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
    41            request.setCharacterEncoding(this.encoding);
    42            if (this.forceEncoding) {
    43               response.setCharacterEncoding(this.encoding);
    44            }
    45        }
    46        filterChain.doFilter(request, response);
    47     }
    48 }

    该字符集过滤器有两个重要参数,分别是encodingforceEncoding

    setEncoding

    public void setEncoding(java.lang.String encoding)

    Set the encodingto use for requests. This encoding will be passed into aServletRequest.setCharacterEncoding(java.lang.String) call.

    setForceEncoding

    public void setForceEncoding(boolean forceEncoding)

    Set whether theconfigured encoding of this filter is supposed to override existing request andresponse encodings.

    通过参考文档,我们可以知道:

    l.第一个方法setEncoding()相当于:ServletRequest.setCharacterEncoding(java.lang.String),即设置request编码格式

    2.第二个方法setForceEncoding()的作用是:同时设置ServletResponseServletRequest的编码格式。

    配置相当于代码中:

    resp.setCharacterEncoding("UTF-8");
    req.setCharacterEncoding("UTF-8");

    在请求处理的过程中我们可以不用考虑编码方面的问题,上面两句代码可以省略,编码统一交给Spring过滤器去处理。

  • 相关阅读:
    Rust started
    修改cargo镜像源
    如何激发团队潜能?
    JVM 09.5 运行时数据区 堆 堆时对象分配的唯一选择吗 逃逸分析
    JVM 09.5 运行时数据区 堆 相关参数设置总结
    JVM 09.4 运行时数据区 堆 线程独占区域 TLAB
    JVM 09.3 运行时数据区 堆 调优/垃圾回收/小结
    JVM 09.2 运行时数据区 堆 年轻带/老年代/对象分配过程
    JVM 09.1 运行时数据区 堆 核心概述
    JVM 08 运行时数据区 本地方法栈
  • 原文地址:https://www.cnblogs.com/niejunlei/p/5279930.html
Copyright © 2020-2023  润新知