通過原理解析Spring mvc的內(nèi)置編碼過濾器
前言
在Spring mvc框架中是如何解決從頁面?zhèn)鱽淼淖址木幋a問題的呢?
下面我們來看看Spring框架給我們提供過濾器CharacterEncodingFilter,話不多說了,來一起看看詳細(xì)的介紹吧。
web.xml 中 添加如下配置:
<filter> <filter-name>characterEncodingFilter</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> <!-- 是否強(qiáng)制所有請求都使用該字符編碼 --> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
spring mvc 內(nèi)部提供了CharacterEncodingFilter過濾器,該過濾器有兩個(gè)參數(shù)encoding和forceEncoding。
1、encoding
設(shè)置請求響應(yīng)的字符編碼。(請求的數(shù)據(jù)使用encoding編碼解析,使用encoding編碼進(jìn)行響應(yīng)的數(shù)據(jù))
2、forceEncoding
forceEncoding=true 強(qiáng)制所有的請求響應(yīng)都使用encoding編碼。
forceEncoding=false 如果請求頭中包含charset,則使用chartset編碼,否則使用encoding編碼。
CharacterEncodingFilter 源碼分析
public class CharacterEncodingFilter extends OncePerRequestFilter {
private String encoding;
private boolean forceRequestEncoding = false;
private boolean forceResponseEncoding = false;
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void setForceEncoding(boolean forceEncoding) {
this.forceRequestEncoding = forceEncoding;
this.forceResponseEncoding = forceEncoding;
}
@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);
}
......
}
CharacterEncodingFilter 中包含 三個(gè)屬性 encoding、forceRequestEncoding、forceResponseEncoding。
- encoding:字符編碼類型
- forceRequestEncoding:request 是否強(qiáng)制使用encoding編碼
- forceResponseEncoding:response 是否強(qiáng)制使用encoding編碼
只要過濾器中配置了forceEncoding 屬性,則forceRequestEncoding和forceResponseEncoding 則保持一致,都使用forceEncoding的值。
doFilterInternal() 方法
該方法是過濾器的核心方法。
如果forceRequestEncoding=true,和forceResponseEncoding=true,則request和response都是用配置的encoding。
如果forceRequestEncoding=false, 則判斷request.getCharacterEncoding()是否有值,如果有值則使用客戶端傳過來的編碼(例如:charset=utf-8)
request.getCharacterEncoding() 解析
request中獲取encoding,追蹤org.apache.coyoteRequest.java類中getCharacterEncoding() 方法。

getContentType() 方法

從代碼中發(fā)現(xiàn),contentType 就是從http請求頭中獲取 content-type屬性。

判斷 content-type 中是否包含charset屬性。如果存在則解析charset的屬性值,并返回。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
PowerJob的ServerDiscoveryService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的ServerDiscoveryService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
JProfiler11使用教程之JVM調(diào)優(yōu)問題小結(jié)
這篇文章主要介紹了JProfiler11使用教程之JVM調(diào)優(yōu),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Spring Boot 2.0.0 終于正式發(fā)布-重大修訂版本
北京時(shí)間 2018 年 3 月 1 日早上,如約發(fā)布的 Spring Boot 2.0 在同步至 Maven 倉庫時(shí)出現(xiàn)問題,導(dǎo)致在 GitHub 上發(fā)布的 v2.0.0.RELEASE 被撤回2018-03-03

