Spring攔截器與Filter過濾器

項(xiàng)目中兑凿,我們可以有兩種方式凯力,進(jìn)行請求的過濾,一種是Filter過濾器礼华,另一種就是Spring攔截器(HandlerInterceptor)咐鹤。

它們都是起前置處理器的作用,能夠在真正的業(yè)務(wù)邏輯執(zhí)行之前進(jìn)行某些前置處理圣絮,例如權(quán)限校驗(yàn)祈惶、登錄校驗(yàn)、日志記錄等等扮匠。

Filter過濾器

過濾器在我們剛接觸web開發(fā)捧请,學(xué)習(xí)Servlet的時(shí)候,就已經(jīng)接觸到了棒搜,應(yīng)該非常的熟悉疹蛉,有點(diǎn)需要注意,過濾器能夠增強(qiáng)進(jìn)出的邏輯帮非,如下:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    //請求傳遞前處理
    chain.doFilter(request, response);
    //請求處理后處理
}

用起來比較簡單氧吐,不做詳細(xì)贅述讹蘑,下面介紹幾個(gè)比較重要的Filter。

CharacterEncodingFilter

<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>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

因?yàn)閣eb容器處理http請求筑舅,默認(rèn)的編碼格式是IOS8859-1座慰。CharacterEncodingFilter的作用就是設(shè)置請求體編碼格式,用于請求體參數(shù)的字節(jié)轉(zhuǎn)字符翠拣,也就是對Post請求的參數(shù)進(jìn)行解碼版仔。

需要注意的是get請求或者URL上的參數(shù)是容器進(jìn)行解碼的,需要設(shè)置容器的URL解碼的字符集误墓。

Get請求與Post請求會有不同處理的原因在于蛮粮,字符串解析是耗性能的,如果不需要使用谜慌,那么就不解析然想,也就不用消耗這部分性能。請求體通常比較大,只有在程序中需要的時(shí)候才會進(jìn)行解碼,而URL需要在傳遞給業(yè)務(wù)類之前就解碼嗜诀。

DelegatingFilterProxy

這個(gè)過濾器是用來代理自定義過濾器的,為什么需要代理妨蛹?因?yàn)閺倪^濾器的配置可以看出,過濾器是不能通過Spring依賴注入的晴竞,有時(shí)候很不方便蛙卤,通過DelegatingFilterProxy進(jìn)行代理,實(shí)際上就是通過ApplicationContext中獲取filter對象

<filter>
    <filter-name>xxx</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>simpleFilter</param-value>
    </init-param>
</filter>
<filter-mapping>
<filter-name>xxx</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

HandlerInterceptor

作為SpringMVC提供的攔截器噩死,HandlerInterceptor有以下三個(gè)方法:

  • preHandle() - 請求處理前被調(diào)用颤难,通過返回值,判定請求是否向下傳遞甜滨。
  • postHandle() - 在請求處理后乐严,數(shù)據(jù)模型產(chǎn)生后被調(diào)用。
  • afterCompletion() - 請求被返回或視圖被返回后調(diào)用衣摩。

在項(xiàng)目中使用昂验,可以有兩種方式,選擇實(shí)現(xiàn)HandlerInterceptor接口或者繼承HandlerInterceptorAdapter類艾扮,配置上有下面兩種方式:

java-based方式配置

只需要繼承WebMvcConfigurerAdapter既琴,并重寫addInterceptors()方法。

@Component
public class CustomerWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter{

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SimpleHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/path1")
    }
}

xml方式配置

使用的是MVC的命名空間標(biāo)簽

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/admin/**"/>
            <ref bean="simpleHandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

Filter和HandlerInterceptor區(qū)別

相同點(diǎn)

Filter和HandlerInterceptor都可以說是過濾器泡嘴,都可以在請求真正處理之前進(jìn)行預(yù)處理操作甫恩,增強(qiáng)了實(shí)際業(yè)務(wù)處理的功能。

差異點(diǎn)

相較與Filter酌予,HandlerInterceptor能夠更加細(xì)粒度的攔截請求磺箕,從上面配置也可以看到奖慌,HandlerInterceptor能夠配置多個(gè)攔截地址,并且能夠排除也就是不過濾特殊請求松靡。

關(guān)于請求鏈的傳遞简僧,HandlerInterceptor通過布爾返回值判定是否繼續(xù)傳遞,而Filter需要主動調(diào)用傳遞雕欺,也就是說ServletRequest和ServletResponse這兩個(gè)對象在Filter傳遞時(shí)可以被替換岛马。

從而可以認(rèn)為HandlerInterceptor處理細(xì)粒度的攔截過濾,F(xiàn)ilter處理粗粒度的屠列,例如請求體中有自定義協(xié)議啦逆,需要預(yù)先解析然后替換ServletRequest或者解壓縮等等操作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笛洛,一起剝皮案震驚了整個(gè)濱河市夏志,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撞蜂,老刑警劉巖盲镶,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝌诡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)枫吧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門浦旱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人九杂,你說我怎么就攤上這事颁湖。” “怎么了例隆?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵甥捺,是天一觀的道長。 經(jīng)常有香客問我镀层,道長镰禾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任唱逢,我火速辦了婚禮吴侦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坞古。我一直安慰自己备韧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布痪枫。 她就那樣靜靜地躺著织堂,像睡著了一般叠艳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上易阳,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天虑绵,我揣著相機(jī)與錄音,去河邊找鬼闽烙。 笑死翅睛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黑竞。 我是一名探鬼主播捕发,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼很魂!你這毒婦竟也來了扎酷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤遏匆,失蹤者是張志新(化名)和其女友劉穎法挨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幅聘,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡纳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帝蒿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荐糜。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖葛超,靈堂內(nèi)的尸體忽然破棺而出暴氏,到底是詐尸還是另有隱情,我是刑警寧澤绣张,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布答渔,位于F島的核電站,受9級特大地震影響侥涵,放射性物質(zhì)發(fā)生泄漏沼撕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一独令、第九天 我趴在偏房一處隱蔽的房頂上張望端朵。 院中可真熱鬧,春花似錦燃箭、人聲如沸冲呢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敬拓。三九已至邻薯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乘凸,已是汗流浹背厕诡。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留营勤,地道東北人灵嫌。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像葛作,于是被迫代替她去往敵國和親寿羞。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理赂蠢,服務(wù)發(fā)現(xiàn)绪穆,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架虱岂,建立于...
    Hsinwong閱讀 22,313評論 1 92
  • 攔截一些請求進(jìn)行處理玖院,比如通過它來進(jìn)行權(quán)限驗(yàn)證,或者是來判斷用戶是否登陸第岖,日志記錄难菌,編碼,或者限制時(shí)間點(diǎn)訪問等等绍傲,...
    JackFrost_fuzhu閱讀 1,964評論 0 7
  • 西晉·李密《陳情表》 臣密言:臣以險(xiǎn)釁(xìn)扔傅,夙遭閔(通“憫”)兇。生孩六月烫饼,慈父見背;行年四歲试读,舅奪母志杠纵。祖...
    小綠植物閱讀 444評論 0 0
  • 尊敬的王總及何校,親愛的家人們大家好! 我是來自山峰教外教育的趙海霞钩骇,今天是我第63天的日精進(jìn)比藻,給大家分享我...
    金八力趙海霞閱讀 198評論 0 0