陶艷芳
摘 要Spring MVC攔截器作為Spring MVC中的一部分,在實(shí)際工作中得到廣泛的應(yīng)用,在項(xiàng)目中合理使用攔截器,可以解決許多常見的問題,本文主要會(huì)簡單概述什么是Spring MVC攔截器,如何通過代碼的方式來配置攔截器,使用攔截器的場景,最后就是簡述攔截器與過濾器的對(duì)比,通過詳細(xì)的描述,你會(huì)對(duì)Spring MVC中攔截器的使用會(huì)有更深刻的理解。
【關(guān)鍵詞】攔截器;Spring MVC;過濾器
1 什么是攔截器
在了解攔截器之前,我們首先要了解一些基本知識(shí)。我們都知道,當(dāng)我們在瀏覽器中輸入U(xiǎn)RL地址的時(shí)候,作為客戶端的瀏覽器就會(huì)向?qū)?yīng)的服務(wù)器發(fā)送一個(gè)請求,同時(shí),瀏覽器中的Burl地址通過各種get或者post的方式向服務(wù)器提交數(shù)據(jù),服務(wù)器在得到這些數(shù)據(jù)前,如果我們想對(duì)數(shù)據(jù)進(jìn)行修改或者配置,那么這個(gè)時(shí)候我們就需要使用到攔截器,簡單來說,攔截器就像海關(guān),如果你攜帶的東西不合標(biāo)準(zhǔn),就扣下,符合了標(biāo)準(zhǔn),才會(huì)讓你通行。攔截器在Spring MVC中處理字符編碼和權(quán)限管理的時(shí)候有很大的作用。
2 攔截器的工作原理
要想了解攔截器的工作原理,我們首先要對(duì)Spring MVC的整體工作流程有了解,下面我就簡單介紹Spring MVC的工作流程,在最新版的Spring MVC中,工作流程如下:當(dāng)用戶在瀏覽器地址欄輸入一個(gè)Burl請求的時(shí)候,該請求首先會(huì)找到配置文件中的DispatcherServlet,如果你沒有配置,那么此時(shí)會(huì)報(bào)錯(cuò),如果配置好了,那么下一步就是找到HandlerMapping來找到對(duì)應(yīng)的HandlerAdapter,這樣能找到你自己寫好的Handler,這里的Handler指的就是你用來處理該請求的類,當(dāng)然,你可以通過注解的方式來配置。在這個(gè)Handler中,返回對(duì)象會(huì)是一個(gè)ModelAndView對(duì)象,這其中的Model表示的就是處理這個(gè)url請求得到的數(shù)據(jù)結(jié)果,這里的View就是服務(wù)器返回給該請求的響應(yīng)界面,這樣Spring MVC框架就會(huì)攜帶數(shù)據(jù)到對(duì)應(yīng)的界面,從而展示結(jié)果給該URL請求。在了解了Spring MVC的工作流程后,我們就很好理解了,攔截器就是通過一些特殊的技術(shù),在Burl請求發(fā)送到DispatcherServlet之間進(jìn)行了攔截。
3 攔截器的實(shí)現(xiàn)
下面我們就通過幾個(gè)步驟來實(shí)現(xiàn)一個(gè)簡單的攔截器:
(1)寫一個(gè)EncodInterceptor類并實(shí)現(xiàn)HandlerInterceptro接口,其中會(huì)有三個(gè)方法需要實(shí)現(xiàn),分別是preHandle、postHandle、afterCompletion,在我們使用之前,需要在afterCompletion方法中的返回值設(shè)置為true,攔截器才會(huì)起作用。
(2)寫好一個(gè)類就可以嗎?當(dāng)然不行,只寫一個(gè)類,系統(tǒng)不會(huì)知道你這個(gè)攔截器要攔截什么請求,我們要在配置文件中添加對(duì)該類的配置,在配置文件中首先使用mvc:interceptor標(biāo)簽,然后在標(biāo)簽中通過bean標(biāo)簽將上面寫好攔截器的類添加進(jìn)去,其中bean標(biāo)簽的class屬性表示的是類的包名點(diǎn)類名的形式。
通過上面的配置,在系統(tǒng)運(yùn)行起來的時(shí)候,客戶端向服務(wù)器端發(fā)送請求后,請求經(jīng)歷配置好的攔截器,默認(rèn)會(huì)執(zhí)行其中三個(gè)方法。至于這三個(gè)方法具體的作用,我們下面會(huì)談?wù)摰?,但是上面的配置,任意一個(gè)請求都會(huì)通過該攔截器,我們有什么方法讓攔截器只攔截我們需要攔截的請求呢?答案是肯定有的,第二步的配置應(yīng)該使用mvc:interceptors標(biāo)簽,然后在標(biāo)簽中添加mvc:interceptors子標(biāo)簽,最后該標(biāo)簽中會(huì)有mvc:mapping標(biāo)簽,該標(biāo)簽中的path中就可以寫你需要攔截的路徑。
4 攔截器中的方法介紹
在上面我們通過HandlerInterceptor接口的方式實(shí)現(xiàn)攔截器時(shí),默認(rèn)會(huì)有三個(gè)方法需要實(shí)現(xiàn):preHandle方法,postHandle方法,afterCompletion方法,下面一一介紹:preHandle方法較特殊,該方法在請求被響應(yīng)前會(huì)被調(diào)用,返回值為boolean類型,表示的是是否要將請求攔截,如果我們在此方法中返回false,客戶端發(fā)送過來的請求會(huì)被終止,不再執(zhí)行下去,如果是true,請求才會(huì)繼續(xù)運(yùn)行。postHandle方法會(huì)在請求被處理之后調(diào)用,而其中的第三個(gè)參數(shù)可以用來顯示視圖以及數(shù)據(jù),在該請求的攔截器中通過參數(shù)來修改該請求對(duì)應(yīng)的響應(yīng)視圖,而該視圖的優(yōu)先級(jí)是大于對(duì)應(yīng)的handler的。afterCompletion方法表示的是在請求執(zhí)行完后會(huì)調(diào)用的方法,就像是PHP中的析構(gòu)函數(shù),最后才調(diào)用。
5 攔截器的使用場景
既然知道了如何使用攔截器,那么接下來,我們就要知道在什么情況下使用,常見的場景有如下幾種:
(1)解決亂碼問題:亂碼在項(xiàng)目中經(jīng)常遇到,或許是因?yàn)榇a編輯工具的問題,也可能是字符編碼問題,但有攔截器后,都可在請求發(fā)出之前統(tǒng)一設(shè)置編碼。
(2)解決權(quán)限認(rèn)證問題:很多項(xiàng)目如商城項(xiàng)目,必須用戶登錄后才能去購買商品,那么此時(shí)在請求發(fā)出前,需要判斷用戶是否已經(jīng)登錄,此時(shí)在攔截器中就可先判斷用戶是否登錄,若未登錄,就跳轉(zhuǎn)到登錄界面等。
6 攔截器與過濾器的對(duì)比與總結(jié)
相信學(xué)習(xí)過java Web的都知道過濾器,其實(shí),攔截器和過濾器是基本相似的,但是還是有區(qū)別,下面來描述一下:首先,攔截器和過濾器的依賴是不同的,如果你使用的項(xiàng)目沒有使用到Spring MVC框架,那么此時(shí)你就是不能使用攔截器,因?yàn)閿r截器依賴框架容器,其本身基于java中的反射機(jī)制,而過濾器即使沒有Spring MVC框架支持,也可以使用,因?yàn)檫^濾器是基于Servlet容器的,并通過了回調(diào)函數(shù)來使用。那么到此為止,對(duì)于攔截器的描述就結(jié)束了,攔截器可以處理我們在Web項(xiàng)目中請求的通用性的問題,合理使用攔截器,可以減少我們的代碼工作量,同時(shí)項(xiàng)目也便于維護(hù)。
參考文獻(xiàn)
[1](美)阿諾德,Ken-Arnold,等.Java程序設(shè)計(jì)語言[M].北京:人民郵電出版社,2006.
作者單位
邵陽學(xué)院 湖南省邵陽市 422000