zoukankan      html  css  js  c++  java
  • SpringMVC——UTF8字符编码过滤器

     一、在web.xml中的配置字符编码过滤器

        <!-- characterEncodingFilter字符编码过滤器 -->
        <filter>
            <filter-name>characterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <!--要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)-->
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <!--是否强制设置request的编码为encoding,默认false,不建议更改-->
                <param-name>forceRequestEncoding</param-name>
                <param-value>false</param-value>
            </init-param>
            <init-param>
                <!--是否强制设置response的编码为encoding,建议设置为true,下面有关于这个参数的解释-->
                <param-name>forceResponseEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>characterEncodingFilter</filter-name>
            <!--这里不能留空或者直接写 ' / ' ,否者不起作用-->
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    二、CharacterEncodingFilter过滤器类源码浅析

     打开该类源码,可以看到该类有三个类属性
    private String encoding; //要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)
    private boolean forceRequestEncoding = false; //是否强制设置request的编码为encoding
    private boolean forceResponseEncoding = false; //是否强制设置response的编码为encoding

    主要方法只有一个,也就是下面这个,代码逻辑很简单,如注释所解释

        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    
            String encoding = getEncoding();
            if (encoding != null) { //如果设置了encoding的值,则根据情况设置request和response的编码
                //若设置request强制编码或request本身就没有设置编码
                //则设置编码为encoding表示的值
                if (isForceRequestEncoding() || request.getCharacterEncoding() == null) { 
                    request.setCharacterEncoding(encoding);
                }
                //若设置response强制编码,则设置编码为encoding表示的值
                if (isForceResponseEncoding()) { //请注意这行代码,下面有额外提醒
                    response.setCharacterEncoding(encoding);
                }
            }
            filterChain.doFilter(request, response);
        }
    # 额外提醒
    if (isForceResponseEncoding()) { 
        response.setCharacterEncoding(encoding);
    }

    是在

    filterChain.doFilter(request, response);
     之前执行的,这也就是说这段代码的作用是设置response的默认编码方式,在之后的代码里是可以根据需求设置为其他编码的,即这里设置的编码可能不是最终的编码,网上很多文档说这里设置的是最终的编码方式,这是错的。

     

  • 相关阅读:
    markown 画图
    C++ 结构体指针
    C++指针详解
    C++ 中类对象与类指针的区别
    Java面向对象㈠ -- 封装
    path和classpath
    "System.Web" 中不存在类型或命名空间
    ASP.NET 后台不识别ASPX中的控件
    asp.net中的<%%>形式的详细用法实例讲解
    ASP.NET前台JS与后台CS函数如何互相调用
  • 原文地址:https://www.cnblogs.com/lyh233/p/12048031.html
Copyright © 2011-2022 走看看