Spring攔截器教程v1.0

Spring攔截器

什么是攔截器

攔截器是Java動(dòng)態(tài)攔截action調(diào)用對(duì)象赏枚,它的出現(xiàn)可以使得開發(fā)者在action執(zhí)行前后糠赦,執(zhí)行自己的代碼邏輯,也可以在一個(gè)動(dòng)作(action)執(zhí)行前阻止其執(zhí)行吠架,應(yīng)用場(chǎng)景很廣泛乳乌,譬如:權(quán)限控制根资,登錄等胎撇。

如何實(shí)現(xiàn)攔截器

既然是基于Spring攔截的狸捕,那么我們首先是要繼承Spring攔截器的接口,去實(shí)現(xiàn)它提供的方法乐设,從而達(dá)到我們自己要實(shí)現(xiàn)功能的攔截目的讼庇。

HandlerInterceptor接口中定義了 3 個(gè)方法,分別為preHandle()伤提、postHandle()和afterCompletion()巫俺,我們就是通過復(fù)寫這 3 個(gè)方法來對(duì)用戶的請(qǐng)求進(jìn)行攔截處理的。因此肿男,我們可以通過直接實(shí)現(xiàn)HandlerInterceptor接口來實(shí)現(xiàn)攔截器的功能介汹。

preHandle

preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):
該方法在請(qǐng)求處理之前進(jìn)行調(diào)用。一個(gè)方法中可以存在多個(gè)攔截器舶沛,而多個(gè)攔截器中的preHandle方法是按照控制器的使用順序而執(zhí)行的嘹承!
該方法的返回值是布爾(Boolean)類型的,當(dāng)它返回為false時(shí)如庭,表示請(qǐng)求結(jié)束叹卷,后續(xù)的Interceptor控制器(Controller)都不會(huì)再執(zhí)行;當(dāng)返回值為true時(shí)坪它,就會(huì)繼續(xù)調(diào)用下一個(gè)InterceptorpreHandle方法骤竹,如果已經(jīng)是最后一個(gè)Interceptor的時(shí)候,就會(huì)是調(diào)用當(dāng)前請(qǐng)求的控制器中的方法往毡。

postHandle

postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):

通過preHandle方法的解釋蒙揣,我們知道這個(gè)方法包括后面要說到的afterCompletion方法都只能在當(dāng)前所屬的Interceptor的preHandle方法的返回值為true的時(shí)候,才能被調(diào)用开瞭。postHandle方法在當(dāng)前請(qǐng)求進(jìn)行處理之后懒震,也就是在控制器中的方法調(diào)用之后執(zhí)行,但是它會(huì)在DispatcherServlet進(jìn)行視圖返回渲染之前被調(diào)用嗤详,所以我們可以在這個(gè)方法中對(duì)控制器處理之后的ModelAndView對(duì)象進(jìn)行操作个扰。postHandle方法被調(diào)用的方向跟preHandle是相反的,也就是說葱色,先聲明的InterceptorpostHandle方法反而會(huì)后執(zhí)行递宅。

afterCompletion

afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):

也是需要當(dāng)前對(duì)應(yīng)的InterceptorpreHandle方法的返回值為true時(shí)才會(huì)執(zhí)行。因此苍狰,該方法將在整個(gè)請(qǐng)求結(jié)束之后恐锣,也就是在DispatcherServlet渲染了對(duì)應(yīng)的視圖之后執(zhí)行,這個(gè)方法的主要作用是用于進(jìn)行資源清理的工作舞痰。

實(shí)現(xiàn)一個(gè)攔截器步驟

①編寫一個(gè)攔截器土榴,繼承HandlerInterceptor接口并實(shí)現(xiàn)需要實(shí)現(xiàn)的攔截器上述接口任意一種或多個(gè)。

②配置文件繼承WebMvcConfigurer接口响牛,并在類開始處開啟自定義配置支持@EnableWebMvc

③添加一個(gè)bean玷禽,實(shí)例化攔截器,以方便注入

④重寫WebMvcConfigurer接口中的addInterceptors方法呀打,來注冊(cè)攔截器

具體實(shí)現(xiàn)攔截器代碼Demo

①Spring配置文件實(shí)例

@Configuration
@EnableWebMvc
@ComponentScan("com.haojishu.demo")
public class MyMvcConfig implements WebMvcConfigurer  {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/classes/views/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        return viewResolver;
    }
    
    public void addInterceptors(InterceptorRegistry registry) {
        // TODO Auto-generated method stub
        registry.addInterceptor(demoInterceptor());
    }
    
    @Bean
    public DemoInterceptor demoInterceptor() {
        System.out.println("注冊(cè)攔截器");
        return new DemoInterceptor();
    }
    
}

②攔截器實(shí)例

public class DemoInterceptor implements HandlerInterceptor  {
    
    public DemoInterceptor() {
        // TODO Auto-generated constructor stub
        System.out.println("構(gòu)造方法執(zhí)行");
    }
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception { 
        System.out.println("請(qǐng)求開始");
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("執(zhí)行完畢后執(zhí)行");
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末矢赁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贬丛,更是在濱河造成了極大的恐慌撩银,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豺憔,死亡現(xiàn)場(chǎng)離奇詭異额获,居然都是意外死亡够庙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門抄邀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耘眨,“玉大人,你說我怎么就攤上這事境肾√弈眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵奥喻,是天一觀的道長(zhǎng)偶宫。 經(jīng)常有香客問我,道長(zhǎng)环鲤,這世上最難降的妖魔是什么纯趋? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮楔绞,結(jié)果婚禮上结闸,老公的妹妹穿的比我還像新娘。我一直安慰自己酒朵,他們只是感情好桦锄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔫耽,像睡著了一般结耀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匙铡,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天图甜,我揣著相機(jī)與錄音,去河邊找鬼鳖眼。 笑死黑毅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钦讳。 我是一名探鬼主播矿瘦,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼愿卒!你這毒婦竟也來了缚去?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤琼开,失蹤者是張志新(化名)和其女友劉穎易结,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搞动,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年躏精,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滋尉。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玉控,死狀恐怖飞主,靈堂內(nèi)的尸體忽然破棺而出狮惜,到底是詐尸還是另有隱情,我是刑警寧澤碌识,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布碾篡,位于F島的核電站,受9級(jí)特大地震影響筏餐,放射性物質(zhì)發(fā)生泄漏开泽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一魁瞪、第九天 我趴在偏房一處隱蔽的房頂上張望穆律。 院中可真熱鬧,春花似錦导俘、人聲如沸峦耘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辅髓。三九已至,卻和暖如春少梁,著一層夾襖步出監(jiān)牢的瞬間洛口,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工凯沪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留第焰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓妨马,卻偏偏與公主長(zhǎng)得像挺举,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子身笤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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