對於過濾器來說,就是在第一次請求前就要過濾條件,比如登錄條件過濾,亂碼過濾、HTTP請求過濾,但是對於這個只知道先過濾字符亂碼然後其他,那麼爲什麼要這麼做呢!我們可以從源碼中看到問題的實質
- CharacterEncodingFilter(通過構造方法來設置傳入的字符集)
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 void setEncoding(@Nullable String encoding) {
this.encoding = encoding;
}
@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);
}
- HiddenHttpMethodFilter,這個一上來就要了一個method並沒有設置字符集什麼的,如果這個在前,那麼必定會發生亂碼
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
requestToUse = new HttpMethodRequestWrapper(request, paramValue);
}
}
filterChain.doFilter(requestToUse, response);
}
所以必須先寫CharacterEncodingFilter再寫HiddenHttpMethodFilter