springmvc字符编码过滤器CharacterEncodingFilter浅析

转自:https://blog.csdn.net/lianjunzongsiling/article/details/77926370
一、在web.xml中的配置



    characterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
        
        encoding
        UTF-8
    
    
        
        forceRequestEncoding
        false
    
    
        
        forceResponseEncoding
        true
    


    characterEncodingFilter
    
    /*

二、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的默认编码方式,在之后的代码里是可以根据需求设置为其他编码的,即这里设置的编码可能不是最终的编码,网上很多文档说这里设置的是最终的编码方式,这是错的。

备注:
1.一般filter都是一个链,web.xml 里面配置了几个就有几个。一个一个的连在一起
request -> filter1 -> filter2 ->filter3 -> …. -> request resource.

2.chain.doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源

你可能感兴趣的:(springmvc字符编码过滤器CharacterEncodingFilter浅析)