SpringMVC之Interceptor

AbstractDetectingUrlHandlerMapping類中的initApplicationContext()方法有一條線是注冊處理器铅乡,另一條線是初始化攔截器分瘦。在SpringMVC之HandlerMapping中我們走讀了注冊處理器的過程,接下來我們看一下攔截器的初始化這條線。

配置攔截器

//在dispatcher-servlet.xml文件中添加下面代碼:
//DefaultInterceptor實現(xiàn)HandlerInterceptor乘凸,<mvc:interceptors>配置的時候茉稠,直接MappedInterceptor。
<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="interceptor.DefaultInterceptor">
        </mvc:interceptor>
</mvc:interceptors>

//WebInterceptor實現(xiàn)HandlerInterceptor卿吐,<bean <property>>配置的時候旁舰,判斷后添加到adaptedInterceptors。
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <bean class="interceptor.DefaultInterceptor1" />
        </list>
    </property>
</bean>

備注: 上面配置文件中兩種攔截器配置方式會產(chǎn)生兩個不同的BeanNameUrlHandlerMapping實例嗡官,那個攔截器配置在前那個BeanNameUrlHandlerMapping實例執(zhí)行箭窜;這樣的話,后面配置的攔截器將不會被執(zhí)行衍腥,所以在配置攔截器的時候選取一種方式即可磺樱。

重要接口和類

  1. HandlerExecutionChain
    Handler和Interceptor集合組成的類

  2. HandlerInterceptor
    SpringMVC攔截器基礎(chǔ)接口

  3. AbstractHandlerMapping
    HandlerMapping的基礎(chǔ)抽象類

  4. AsyncHandlerInterceptor

繼承HandlerInterceptor的接口,額外提供了afterConcurrentHandlingStarted方法婆咸,該方法是用來處理異步請求坊罢。當(dāng)Controller中有異步請求方法的時候會觸發(fā)該方法。異步請求先支持preHandle擅耽、然后執(zhí)行afterConcurrentHandlingStarted活孩。異步線程完成之后執(zhí)行preHandle、postHandle乖仇、afterCompletion憾儒。

  1. HandlerInterceptorAdapter
    實現(xiàn)AsyncHandlerInterceptor接口的抽象類

  2. WebRequestInterceptor

與HandlerInterceptor接口類似,區(qū)別是WebRequestInterceptor的preHandle沒有返回值乃沙。還有WebRequestInterceptor是針對請求的起趾,接口方法參數(shù)中沒有response。

  1. MappedInterceptor

一個包括includePatterns和excludePatterns字符串集合并帶有HandlerInterceptor的類警儒。 很明顯训裆,就是對于某些地址做特殊包括和排除的攔截器眶根。

  1. ConversionServiceExposingInterceptor

默認(rèn)的<annotation-driven/>標(biāo)簽初始化的時候會初始化ConversionServiceExposingInterceptor這個攔截器,并被當(dāng)做構(gòu)造方法的參數(shù)來構(gòu)造MappedInterceptor边琉。之后會被加入到AbstractHandlerMapping的mappedInterceptors集合中属百。該攔截器會在每個請求之前往request中丟入ConversionService。主要用于spring:eval標(biāo)簽的使用变姨。

源碼走讀

//AbstractDetectingUrlHandlerMapping類中initApplicationContext()實現(xiàn)
public void initApplicationContext() throws ApplicationContextException {
    //初始化攔截器
    super.initApplicationContext();
    detectHandlers();
}

//AbstractHandlerMapping類中initApplicationContext()實現(xiàn)
protected void initApplicationContext() throws BeansException {
    //<bean <property>>配置的攔截器如:DefaultInterceptor1
    extendInterceptors(this.interceptors);
    //<mvc:interceptors>配置的攔截器如:DefaultInterceptor
    detectMappedInterceptors(this.mappedInterceptors);
    //將<bean <property>>配置的攔截器添加到對應(yīng)的攔截器List中
    initInterceptors();
}
AbstractHandlerMapping類中initInterceptors()實現(xiàn)
protected void initInterceptors() {
    if (!this.interceptors.isEmpty()) {
        for (int i = 0; i < this.interceptors.size(); i++) {
            Object interceptor = this.interceptors.get(i);
            if (interceptor == null) {
                throw new IllegalArgumentException("Entry number " + i + " in interceptors array is null");
            }
            //List<MappedInterceptor>
            if (interceptor instanceof MappedInterceptor) {
                this.mappedInterceptors.add((MappedInterceptor) interceptor);
            }
            //添加到List<HandlerInterceptor>
            else {
                this.adaptedInterceptors.add(adaptInterceptor(interceptor));
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末族扰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子定欧,更是在濱河造成了極大的恐慌渔呵,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砍鸠,死亡現(xiàn)場離奇詭異扩氢,居然都是意外死亡,警方通過查閱死者的電腦和手機爷辱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門录豺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托嚣,你說我怎么就攤上這事巩检。” “怎么了示启?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵兢哭,是天一觀的道長。 經(jīng)常有香客問我夫嗓,道長迟螺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任舍咖,我火速辦了婚禮矩父,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘排霉。我一直安慰自己窍株,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布攻柠。 她就那樣靜靜地躺著球订,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑰钮。 梳的紋絲不亂的頭發(fā)上冒滩,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音浪谴,去河邊找鬼开睡。 笑死因苹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篇恒。 我是一名探鬼主播扶檐,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼婚度!你這毒婦竟也來了蘸秘?” 一聲冷哼從身側(cè)響起官卡,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蝗茁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寻咒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哮翘,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年毛秘,在試婚紗的時候發(fā)現(xiàn)自己被綠了饭寺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡叫挟,死狀恐怖艰匙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抹恳,我是刑警寧澤员凝,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站奋献,受9級特大地震影響健霹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓶蚂,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一糖埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窃这,春花似錦瞳别、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朴上,卻和暖如春垒棋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痪宰。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工叼架, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畔裕,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓乖订,卻偏偏與公主長得像扮饶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乍构,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理甜无,服務(wù)發(fā)現(xiàn),斷路器哥遮,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 從三月份找實習(xí)到現(xiàn)在岂丘,面了一些公司,掛了不少眠饮,但最終還是拿到小米奥帘、百度、阿里仪召、京東寨蹋、新浪、CVTE扔茅、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,211評論 11 349
  • 姓名: 李小娜 [嵌牛導(dǎo)讀]: SpringMVC 中的Interceptor 攔截器也是相當(dāng)重要和相當(dāng)有用的已旧,...
    n184閱讀 3,151評論 0 4
  • 許巍在他的歌里唱道:“生活不止眼前的茍且,還有詩和遠(yuǎn)方的田野召娜,你赤手空拳來到人世間运褪,為找到那片海不顧一切……” 一...
    若水希言閱讀 1,834評論 0 8
  • 心想事成是每一位人類心之所向的事情!那要如何才能做到心想事成萤晴,或者說:你想的正好確實是你真心想要的呢吐句?可能有讀...
    詩寶貝閱讀 282評論 0 0