首先,放上web.xml中编码过滤器的设置
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
本人不太理解的是,这个编码过滤器到底过滤了哪些编码?
首先,jsp页面有
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
其中的contentType的charset的utf-8是对服务器的响应回来的东西进行编码的编码(和后台设置的response.setCharacterEncoding(“UTF-8”)是一回事)
其中的pageEncodeing的utf-8是jsp转化成servlet(.java文件)的编码,要与jsp文件本身的编码格式一致(比如eclispe设置的),不一致就会出现乱码。
还有一个注意事宜:如果页面没有对<@page>中的contentType中设置charset的编码方式,然后后台也没有对response.setCharacterEncoding()进行设置,pageEncoding也可以对服务器的响应回来的东西进行编码的编码。
然后html中有
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
这个的contentType的charset的utf-8是设置页面的静态文字的编码,也就是说对html页面的编码。
还有一个是request.setCharacterEncoding(“UTF-8”)是设置对客户端请求进行重新编码的编码。
然后回归编码过滤器代码上面已经放了,我们看一下源码
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
}
}
filterChain.doFilter(request, response);
}
可以看到这里只是对请求响应的编码方式进行了设置,所以说,web.xml中设置了编码过滤器,前台jsp中的<@page>中的contentType可以不设置,但是正常来说写一下也无妨,其他的地方的编码设置不能省略。
以上是个人搜集资料理解合成,如有不对,欢迎指正!