Spring Servlet Web 5.1.3 常用過濾器 : CharacterEncodingFilter
阿新 • • 發佈:2019-01-12
概述
該過濾器允許指定字符集處理使用者請求或者響應。在瀏覽器沒有對請求指定字符集的情況下,我們可以使用該方案指定使用那種字符集處理請求。
該過濾器應用在請求缺少字符集資訊時會應用指定的字符集,但也可以通過設定過濾器屬性forceRequestEncoding
為true
強制使用制定給過濾器的字符集。實際上,也可以通過設定過濾器屬性forceResponseEncoding
為true
強制響應使用指定給過濾器的字符集。
該過濾器繼承自OncePerRequestFilter
,也就是說,它在整個請求處理過程中最多隻會被應用一次。
Springboot
提供了一個OrderedCharacterEncodingFilter
CharacterEncodingFilter
應用在基於Springboot
的Web
應用中。OrderedCharacterEncodingFilter
在CharacterEncodingFilter
的功能上增加了介面OrderedFilter
定義的過濾器順序,並且預設使用最高優先順序。換句話講,它會是整個過濾器鏈中第一個被呼叫的過濾器。
Springboot
預設會根據配置屬性spring.http.encoding
設定OrderedCharacterEncodingFilter
的字符集和forceRequestEncoding
/forceResponseEncoding
。預設情況下,它們的分別使用:UTF-8
,false
,false
。參考自動配置HttpEncodingAutoConfiguration
。
原始碼解析
package org.springframework.web.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
public class CharacterEncodingFilter extends OncePerRequestFilter {
// 制定給該過濾器的字符集(也可以理解為編碼方式)
@Nullable
private String encoding;
// 是否強制請求使用指定的字符集
private boolean forceRequestEncoding = false;
// 是否強制響應使用指定的字符集
private boolean forceResponseEncoding = false;
// 建構函式 ,執行之後 :
// encoding : null
// forceRequestEncoding : false
// forceResponseEncoding : false
public CharacterEncodingFilter() {
}
// 建構函式 ,執行之後 :
// encoding : 同參數encoding
// forceRequestEncoding : false
// forceResponseEncoding : false
public CharacterEncodingFilter(String encoding) {
this(encoding, false);
}
// 建構函式 ,執行之後 :
// encoding : 同參數encoding
// forceRequestEncoding : 同參數forceEncoding
// forceResponseEncoding : 同參數forceEncoding
public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
this(encoding, forceEncoding, forceEncoding);
}
// 建構函式 ,執行之後 :
// encoding : 同參數encoding
// forceRequestEncoding : 同參數 forceRequestEncoding
// forceResponseEncoding : 同參數 forceResponseEncoding
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;
}
/**
* Return the configured encoding for requests and/or responses.
* @since 4.3
*/
@Nullable
public String getEncoding() {
return this.encoding;
}
// 可以在建構函式執行之後指定 forceRequestEncoding/forceResponseEncoding都為forceEncoding
public void setForceEncoding(boolean forceEncoding) {
this.forceRequestEncoding = forceEncoding;
this.forceResponseEncoding = forceEncoding;
}
// 可以在建構函式執行之後指定 forceRequestEncoding
public void setForceRequestEncoding(boolean forceRequestEncoding) {
this.forceRequestEncoding = forceRequestEncoding;
}
/**
* Return whether the encoding should be forced on requests.
* @since 4.3
*/
public boolean isForceRequestEncoding() {
return this.forceRequestEncoding;
}
// 可以在建構函式執行之後指定 forceResponseEncoding
public void setForceResponseEncoding(boolean forceResponseEncoding) {
this.forceResponseEncoding = forceResponseEncoding;
}
/**
* Return whether the encoding should be forced on responses.
* @since 4.3
*/
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) {
// 如果指定了字符集
// 並且 forceRequestEncoding 或者 請求沒有字符集資訊,則請求使用指定的字符集
request.setCharacterEncoding(encoding);
}
if (isForceResponseEncoding()) {
// 如果指定了字符集
// 並且 forceResponseEncoding , 則響應使用指定的字符集
response.setCharacterEncoding(encoding);
}
}
filterChain.doFilter(request, response);
}
}