通過(guò)原理解析Spring mvc的內(nèi)置編碼過(guò)濾器
前言
在Spring mvc框架中是如何解決從頁(yè)面?zhèn)鱽?lái)的字符串的編碼問(wèn)題的呢?
下面我們來(lái)看看Spring框架給我們提供過(guò)濾器CharacterEncodingFilter,話(huà)不多說(shuō)了,來(lái)一起看看詳細(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)制所有請(qǐ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過(guò)濾器,該過(guò)濾器有兩個(gè)參數(shù)encoding和forceEncoding。
1、encoding
設(shè)置請(qǐng)求響應(yīng)的字符編碼。(請(qǐng)求的數(shù)據(jù)使用encoding編碼解析,使用encoding編碼進(jìn)行響應(yīng)的數(shù)據(jù))
2、forceEncoding
forceEncoding=true 強(qiáng)制所有的請(qǐng)求響應(yīng)都使用encoding編碼。
forceEncoding=false 如果請(qǐng)求頭中包含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:字符編碼類(lèi)型
- forceRequestEncoding:request 是否強(qiáng)制使用encoding編碼
- forceResponseEncoding:response 是否強(qiáng)制使用encoding編碼
只要過(guò)濾器中配置了forceEncoding 屬性,則forceRequestEncoding和forceResponseEncoding 則保持一致,都使用forceEncoding的值。
doFilterInternal() 方法
該方法是過(guò)濾器的核心方法。
如果forceRequestEncoding=true,和forceResponseEncoding=true,則request和response都是用配置的encoding。
如果forceRequestEncoding=false, 則判斷request.getCharacterEncoding()是否有值,如果有值則使用客戶(hù)端傳過(guò)來(lái)的編碼(例如:charset=utf-8)
request.getCharacterEncoding() 解析
request中獲取encoding,追蹤org.apache.coyoteRequest.java類(lèi)中getCharacterEncoding() 方法。

getContentType() 方法

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

判斷 content-type 中是否包含charset屬性。如果存在則解析charset的屬性值,并返回。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java如何獲取接口所有的實(shí)現(xiàn)類(lèi)
這篇文章主要介紹了Java如何獲取接口所有的實(shí)現(xiàn)類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
PowerJob的ServerDiscoveryService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的ServerDiscoveryService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
JProfiler11使用教程之JVM調(diào)優(yōu)問(wèn)題小結(jié)
這篇文章主要介紹了JProfiler11使用教程之JVM調(diào)優(yōu),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Spring Boot 2.0.0 終于正式發(fā)布-重大修訂版本
北京時(shí)間 2018 年 3 月 1 日早上,如約發(fā)布的 Spring Boot 2.0 在同步至 Maven 倉(cāng)庫(kù)時(shí)出現(xiàn)問(wèn)題,導(dǎo)致在 GitHub 上發(fā)布的 v2.0.0.RELEASE 被撤回2018-03-03
springboot3.x中Jakarta包無(wú)法引入的問(wèn)題
最近想將一些項(xiàng)目升級(jí)到springboot3.x和java17的時(shí)候,發(fā)現(xiàn)項(xiàng)目依賴(lài)中有Jakarta的包,但是代碼標(biāo)紅提示沒(méi)有相關(guān)的類(lèi),本文就來(lái)介紹一下解決方法,感興趣的可以了解一下2024-02-02

