-
<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> -
<init-param> -
<param-name>forceEncoding</param-name> -
<param-value>false</param-value> -
</init-param> -
</filter>
-
<filter-mapping> -
<filter-name>encodingFilter</filter-name> -
<url-pattern>/*</url-pattern> -
</filter-mapping>
-
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) -
throws ServletException, IOException {
-
...........
-
...........
-
String alreadyFilteredAttribute Name = getAlreadyFilteredAttrib uteName(); -
if (request.getAttribute(alreadyFilteredAttribute Name) != null || shouldNotFilter(httpRequest)) {
-
filterChain.doFilter(request, response); -
} -
else { -
request.setAttribute(alreadyFilteredAttribute Name, Boolean.TRUE); -
try { -
doFilterInternal(httpRequest, httpResponse, filterChain); -
} -
finally {
-
request.removeAttribute(alreadyFilteredAttribute Name); -
} -
} -
}
- public
static final String ALREADY_FILTERED_SUFFIX = ".FILTERED";(在OncePerRequestFilter中定义的常量)
说明:
1. getAlreadyFilteredAttrib
2. 当request.setAttribute(alreadyFilteredAttribute
-
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 && responseSetCharacterEnco dingAvailable) { -
response.setCharacterEncoding(this.encoding); -
} -
} -
filterChain.doFilter(request, response); -
}
- private
final static boolean responseSetCharacterEnco dingAvailable = ClassUtils.hasMethod( -
HttpServletResponse.class, "setCharacterEncoding", new Class[] {String.class});
说明:
1. 静态常量responseSetCharacterEnco
2. this.encoding != null :当encoding初始化参数被指定时条件满足。
3. (this.forceEncoding || request.getCharacterEncoding() == null)==true:当forceEncoding初始化参数设置为true或者request已经被指定了一个字符编码的时候条件满足。
如果没记得错,Spring早期版本这个方法得实现应该是:
-
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) -
throws ServletException, IOException {
-
if (this.forceEncoding || request.getCharacterEncoding() == null) { -
request.setCharacterEncoding(this.encoding); -
} -
filterChain.doFilter(request, response); -
}
参数forceEncoding的作用很明显了吧!以前只是对request字符编码起作用,现在如果将forceEncoding设为true也会影响到response中的字符编码,通常这个是我们不希望的。
总结:
1.
2.