必威体育Betway必威体育官网
当前位置:首页 > IT技术

当 CharacterEncodingFilter 遇到 HttpMessageConverter

时间:2019-10-05 03:43:13来源:IT技术作者:seo实验室小编阅读:87次「手机版」
 

characterencodingfilter

先解释下几个相关的接口:

/**
 * 表示 HTTP 请求消息和响应消息的基本接口
 * 可以通过 getheaders() 获取相应的 HttpHeaders
 */
public interface Httpmessage {
    /**
     * 返回消息头(请求头/响应头)
     */
    HttpHeaders getHeaders();
}

/**
 * 对 HTTP 响应消息的抽象
 */
public interface HttpOutputMessage extends HttpMessage {
    /**
     * 以 outputstream 返回消息体
     */
    OutputStream getbody() throws IOException;
}

/**
 * 对 HTTP 请求消息的抽象
 */
public interface HttpInputMessage extends HttpMessage {
    /**
     * 以 InputStream 返回消息体
     */
    InputStream getBody() throws IOException;
}

说白了,HttpInputMessageHttpOutputMessageSpringMVC 对请求消息和响应消息对抽象。

这里写图片描述

在 SpringMVC 中 请求消息和响应消息的最终实现就是ServletServerHttprequest以及ServletServerHttpresponse。这两个实现类又分别封装有HttpServletRequest以及HttpServletResponse。

Servlet容器如Tomcat将请求和响应封装为HttpServletRequest/HttpServletResponse,然后传递给使用者。

这里写图片描述

这里写图片描述

public class CharacterEncodingFilter extends OncePerRequestFilter {

    @Nullable
    private String encoding;
    private boolean forceRequestEncoding = false;
    private boolean forceResponseEncoding = false;

    public CharacterEncodingFilter() {
    }

    public CharacterEncodingFilter(String encoding) {
        this(encoding, false);
    }

    public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
        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;
    }

    public void setEncoding(@Nullable String encoding) {
        this.encoding = encoding;
    }

    @Nullable
    public String getEncoding() {
        return this.encoding;
    }

    public void setForceEncoding(boolean forceEncoding) {
        this.forceRequestEncoding = forceEncoding;
        this.forceResponseEncoding = forceEncoding;
    }

    public void setForceRequestEncoding(boolean forceRequestEncoding) {
        this.forceRequestEncoding = forceRequestEncoding;
    }

    public boolean isForceRequestEncoding() {
        return this.forceRequestEncoding;
    }

    public void setForceResponseEncoding(boolean forceResponseEncoding) {
        this.forceResponseEncoding = forceResponseEncoding;
    }

    public boolean isForceResponseEncoding() {
        return this.forceResponseEncoding;
    }

    @Override
    protected void doFilterInternal(
            HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        String encoding = getEncoding();
        if (encoding != null) {
            if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
                request.setCharacterEncoding(encoding);
            }
            if (isForceResponseEncoding()) {
                response.setCharacterEncoding(encoding);
            }
        }
        filterChain.doFilter(request, response);
    }
}

这里写图片描述

CharacterEncodingFilter 作为一个Filter,用来设置请求和响应的编码。

在 servlet 容器中 Filter 优先于 servlet 的执行。

那么在 SpringMVC 中 Filter 也会优先于 handlerInterceptor 以及 controller 的执行。

而一般的 HttpMessageConverter 只会去操作 HttpIntputMessage 以及HttpOutputMessage 里的getBody()方法返回的 InputStream 以及 OutputStream。

这里写图片描述

那么,返回给浏览器的字符编码将会由SpringMVC(HttpMessageConverter)指定。

对于HttpMessageConverter一般都会有默认的编码(ISO-8859-1),所以CharacterEncodingFilter指定的编码在以下代码中被覆盖了。

这里写图片描述

CharacterEncodingFilter 这个东东用在纯 Servlet 中还是很不错的。在 Spring 中使用就有些鸡肋了。=。=

同时 HttpServletResponse 需要设置 “contentType”response.setcontenttype("text/plain");,否则 setCharacterEncoding 并不会起作用。


这里写图片描述

如上,Jetty 实现的getCharacterEncoding会首先在_contentType字段中读取。

相关阅读

CharacterEncodingFilter的作用

在web.xml文件中,我们经常可以看到配置的统一编码过滤器,他继承了OncePerRequestFilter,而OncePerRequestFilter继承自GenericFilter

CharacterEncodingFilter 详解

一、什么是CharacterEncodingFilter官方解释如下是spring内置过滤器的一种,用来指定请求或者响应的编码格式。在web开发中经常被从

Spring MVC过滤器-字符集过滤器(CharacterEncodingFilt

Spring的字符集过滤通过用于处理项目中的乱码问题,该过滤器位于org.springframework.web.filter包中,指向类CharacterEncodingFilte

分享到:

栏目导航

推荐阅读

热门阅读