通過原理解析Spring mvc的內(nèi)置編碼過濾器
前言
在Spring mvc框架中是如何解決從頁面?zhèn)鱽淼淖址木幋a問題的呢?
下面我們來看看Spring框架給我們提供過濾器CharacterEncodingFilter,話不多說了,來一起看看詳細的介紹吧。
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> <!-- 是否強制所有請求都使用該字符編碼 --> <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過濾器,該過濾器有兩個參數(shù)encoding和forceEncoding。
1、encoding
設置請求響應的字符編碼。(請求的數(shù)據(jù)使用encoding編碼解析,使用encoding編碼進行響應的數(shù)據(jù))
2、forceEncoding
forceEncoding=true
強制所有的請求響應都使用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 中包含 三個屬性 encoding、forceRequestEncoding、forceResponseEncoding。
- encoding:字符編碼類型
- forceRequestEncoding:request 是否強制使用encoding編碼
- forceResponseEncoding:response 是否強制使用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的屬性值,并返回。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
PowerJob的ServerDiscoveryService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的ServerDiscoveryService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12JProfiler11使用教程之JVM調(diào)優(yōu)問題小結
這篇文章主要介紹了JProfiler11使用教程之JVM調(diào)優(yōu),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03Spring Boot 2.0.0 終于正式發(fā)布-重大修訂版本
北京時間 2018 年 3 月 1 日早上,如約發(fā)布的 Spring Boot 2.0 在同步至 Maven 倉庫時出現(xiàn)問題,導致在 GitHub 上發(fā)布的 v2.0.0.RELEASE 被撤回2018-03-03