• (6)SpringMVC中使用CharacterEncodingFilter编码过滤器处理请求和响应的乱码问题


    处理SpringMVC中乱码问题

    处理原生Servlet中请求和响应的乱码问题,参考文章

    Servlet中的过滤器的实现及其原理,参考文章

    配置CharacterEncodingFilter

    在Servlet规范中要求request和response对象设置编码之前不能有获取请求参数和响应数据的操作,否则后续设置的编码都将不起作用

    • 但是DispatcherServlet给控制器方法注入request时一定是已经获取了所有的请求参数,否则我们不能直接在控制器方法上声明形参获取请求参数的值

    在web.xml中注册SpringMVC提供的编码过滤器CharacterEncodingFilter, 要想在DispatcherServlet获取参数前设置编码必须在其他过滤器之前配置它否则无效

    • 使用init-param初始化参数标签设置encoding属性的值指定POST请求的编码格式,如UTF-8
    • 使用init-param初始化参数标签设置forceEncoding属性的值指定响应的编码格式,true表示响应和请求的编码格式一致,fasle表示默认编码格式
    
    <filter>
        <filter-name>CharacterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
        <init-param>
            
            <param-name>forceEncodingparam-name>	
            <param-value>trueparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    CharacterEncodingFilter继承的OncePerRuquestFilter重写了doFilter(request,response,filter)并调用doFilterInternal(request,response,filter)方法执行过滤

    // CharacterEncodingFilter的构造方法
    public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
        // encoding属性的值是我们在配置文件中设置的编码格式
        // forceEncoding属性的值就是我们在配置文件中设置的布尔值true
        this(encoding,forceEncoding,forceEncoding);
    }
    
    public CharacterEncodingFilter(string encoding, boolean forceRequestEncoding, boolean forceResponseEncoding){
        Assert.hasLength(encoding,"Encoding must not be empty");
        this.encoding = encoding;
        this.forceRequestEncoding = forceRequestEncoding;
        this.forceResponseEncoding = forceResponseEncoding;
    }
    
    // OncePerRuquestFilter重写了doFilter(request,response,filter)
    @override
    public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
        throws servletException, IOException {
        //.............
        // 满足条件放行
        filterChain.doFilter(request,response);
    
        // 不满足条件执行过滤规则
        doFilterInternal(httprequest,httpresponse,filterChain);
    }
    
    // CharacterEncodingFilter重写的doFilterInternal方法
    protected void doFilterInternal(HttpservletRequest request, 
                                    HttpservletResponse response, FilterChain filtel)throws ServletExceptionIOException {
        string encoding = getEncoding(); 
        // 判断我们在是否在web.xml文件中设置了编码格式
        if (encoding != null) {
            // 如果设置了编码格式,并且forceRequestEncoding的属性值为true或request对象之前没有设置过编码(确实没有设置过),此时就可以设置请求的编码
            if (isForceRequestEncoding() || request.getcharacterEncoding() == null){
                // 设置请求的编码
                request.setCharacterEncoding(encoding);
            }
            // 如果设置了编码格式,并且forceResponseEncoding属性值为true,此时就可以设置响应的编码
            if (isForceResponseEncoding()){
                response.setcharacterEncoding(encoding);
            }
    
        }
        // 放行
        filterchain.dofilter(reauest. response);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    国内首发可视化智能调优平台,小龙带你玩转KeenTune UI
    【数字图像处理】直方图均衡化与规定化
    21. 合并两个有序链表
    c:Bubble Sort
    百趣代谢组学资讯:项目文章Nature,揭示低温暴露抑制实体瘤生长机制,‘饿死’癌细胞
    大健康产业商业供应链管理系统:采购管理规范化,提高企业采购效益
    易基因|RNA m6A甲基化测序(MeRIP-seq)技术介绍
    程序员都看不懂的代码
    使用synchronized解决原子性问题
    纯IP地址可以申请SSL证书实现HTTPS访问吗?
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/133710772