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è)置請求響應(yīng)的字符編碼。(請求的數(shù)據(jù)使用encoding編碼解析,使用encoding編碼進行響應(yīng)的數(shù)據(jù))
  2. forceEncoding
    forceEncoding=true 強制所有的請求響應(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 中包含 三個屬性 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類中g(shù)etCharacterEncoding() 方法。


getContentType() 方法


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


判斷 content-type 中是否包含charset屬性。如果存在則解析charset的屬性值,并返回。

想了解更多精彩內(nèi)容請關(guān)注我的公眾號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • application的配置屬性。 這些屬性是否生效取決于對應(yīng)的組件是否聲明為Spring應(yīng)用程序上下文里的Bea...
    新簽名閱讀 5,539評論 1 27
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評論 6 342
  • 這些屬性是否生效取決于對應(yīng)的組件是否聲明為 Spring 應(yīng)用程序上下文里的 Bean(基本是自動配置的),為一個...
    發(fā)光的魚閱讀 1,489評論 0 14
  • 鳳府鳳老爺?shù)臅浚酥煌脬y耳粥輕輕敲敲門:“老爺,怡兒進來了……” 屋內(nèi)沒有回應(yīng),柳怡沉思一下,推門而進。一...
    凌諾伊閱讀 283評論 0 0

友情鏈接更多精彩內(nèi)容