springmvc字符编码过滤器CharacterEncodingFilter浅析

时间:2021-05-11 15:43:48

一、在web.xml中的配置

    <!-- characterEncodingFilter字符编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!--这里的url根据你项目需求自己改-->
<url-pattern>/</url-pattern>
</filter-mapping>

二、CharacterEncodingFilter过滤器类浅析

打开该类源码,可以看到该类有三个类属性

private String encoding;

private boolean forceRequestEncoding = false;

private boolean forceResponseEncoding = false;

主要方法只有一个,也就是下面这个

    @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);
}

可以看到这个作用器的作用就是在request和response没有设置字符编码方式的时候设置一个编码方式。注意

if (isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}

是在

filterChain.doFilter(request, response);

之前执行的,也就是说设置的是response的默认编码方式,可以自己在代码里修改为其他的编码方式,网上有些文档说的是设置的是最终的编码方式,这是错的。


原创不易,转帖请注明出处—shizhongqi