SpringMVC中使用Interceptor攔截器順序_第1頁
SpringMVC中使用Interceptor攔截器順序_第2頁
SpringMVC中使用Interceptor攔截器順序_第3頁
SpringMVC中使用Interceptor攔截器順序_第4頁
SpringMVC中使用Interceptor攔截器順序_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、SpringMVC中的Interceptor攔截器也是相當(dāng)重要和相當(dāng)有用的,它的主要作用是攔截用戶的請求并進(jìn)行相應(yīng)的處理。比如通過它來進(jìn)行權(quán)限驗證,或者是來判斷用戶是否登陸,或者是像12306那樣子判斷當(dāng)前時間是否是購票時間。一、定義Interceptor實現(xiàn)類SpringMVC中的Interceptor攔截請求是通過HandlerInterceptor來實現(xiàn)的。在SpringMVC中定義一個Interceptor非常簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實現(xiàn)了spring的HandlerInterceptor接口,或者是這個類繼承實現(xiàn)了HandlerInterc

2、eptor接口的類,比如Spring已經(jīng)提供的實現(xiàn)了HandlerInterceptor接口的抽象類HandlerInterceptorAdapter;第二種方式是實現(xiàn)Spring的WebRequestInterceptor接口,或者是繼承實現(xiàn)了WebRequestInterceptor的類。(一)實現(xiàn)HandlerInterceptor接口HandlerInterceptor接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進(jìn)行攔截處理的。(1)preHandle(HttpServletRequestrequest,HttpServletResponseresponse,Object

3、handle)方法,顧名思義,該方法將在請求處理之前進(jìn)行調(diào)用。SpringMVC中的Interceptor是鏈?zhǔn)降恼{(diào)用的,在一個應(yīng)用中或者說是在一個請求中可以同時存在多個Interceptor。每個Interceptor的調(diào)用會依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor中的preHandle方法,所以可以在這個方法中進(jìn)行一些前置初始化操作或者是對當(dāng)前請求的一個預(yù)處理,也可以在這個方法中進(jìn)行一些判斷來決定請求是否要繼續(xù)進(jìn)行下去。該方法的返回值是布爾值Boolean類型的,當(dāng)它返回為false時,表示請求結(jié)束,后續(xù)的Interceptor和Controller都不會再執(zhí)行;

4、當(dāng)返回值為true時就會繼續(xù)調(diào)用下一個Interceptor的preHandle方法,如果已經(jīng)是最后一個Interceptor的時候就會是調(diào)用當(dāng)前請求的Controller方法。(2)postHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,ModelAndViewmodelAndView)方法,由preHandle方法的解釋我們知道這個方法包括后面要說到的afterCompletion方法都只能是在當(dāng)前所屬的Interceptor的preHandle方法的返回值為true時才能被調(diào)用。postH

5、andle方法,顧名思義就是在當(dāng)前請求進(jìn)行處理之后,也就是Controller方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet進(jìn)行視圖返回渲染之前被調(diào)用,所以我們可以在這個方法中對Controller處理之后的ModelAndView對象進(jìn)行操作。postHandle方法被調(diào)用的方向跟preHandle是相反的,也就是說先聲明的Interceptor的postHandle方法反而會后執(zhí)行,這和Struts2里面的Interceptor的執(zhí)行過程有點(diǎn)類型。Struts2里面的Interceptor的執(zhí)行過程也是鏈?zhǔn)降?,只是在Struts2里面需要手動調(diào)用ActionInvocati

6、on的invoke方法來觸發(fā)對下一個Interceptor或者是Action的調(diào)用,然后每一個Interceptor中在invoke方法調(diào)用之前的內(nèi)容都是按照聲明順序執(zhí)行的,而invoke方法之后的內(nèi)容就是反向的。(3)afterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,Exceptionex)方法,該方法也是需要當(dāng)前對應(yīng)的Interceptor的preHandle方法的返回值為true時才會執(zhí)行。顧名思義,該方法將在整個請求結(jié)束之后,也就是在DispatcherServlet渲染

7、了對應(yīng)的視圖之后執(zhí)行。這個方法的主要作用是用于進(jìn)行資源清理工作的。下面是一個簡單的代碼說明:importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;publicclassSpringMVCInterceptorimplementsHandlerIntercept

8、or/* preHandle方法是進(jìn)行處理器攔截用的,顧名思義,該方法將在Controller處理之前進(jìn)行調(diào)用,SpringMVC中的Interceptor攔截器是鏈?zhǔn)降?,可以同時存在* 多個Interceptor,然后SpringMVC會根據(jù)聲明的前后順序一個接一個的執(zhí)行,而且所有的Interceptor中的preHandle方法都會在* Controller方法調(diào)用之前調(diào)用。SpringMVC的這種Interceptor鏈?zhǔn)浇Y(jié)構(gòu)也是可以進(jìn)行中斷的,這種中斷方式是令preHandle的返* 回值為false,當(dāng)preHandle的返回值為false的時候整個請求就結(jié)束了。*/Override

9、publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException/TODOAuto-generatedmethodstubreturnfalse;/* 這個方法只會在當(dāng)前這個Interceptor的preHandle方法返回值為true的時候才會執(zhí)行。postHandle是進(jìn)行處理器攔截用的,它的執(zhí)行時間是在處理器進(jìn)行處理之* 后,也就是在Controller的方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet進(jìn)行視圖的渲染之前執(zhí)行,也

10、就是說在這個方法中你可以對ModelAndView進(jìn)行操*作。這個方法的鏈?zhǔn)浇Y(jié)構(gòu)跟正常訪問的方向是相反的,也就是說先聲明的Interceptor攔截器該方法反而會后調(diào)用,這跟Struts2里面的攔截器的執(zhí)行過程有點(diǎn)像,* 只是Struts2里面的intercept方法中要手動的調(diào)用ActionInvocation的invoke方法,Struts2中調(diào)用ActionInvocation的invoke方法就是調(diào)用下一個Interceptor* 或者是調(diào)用action,然后要在Interceptor之前調(diào)用的內(nèi)容都寫在調(diào)用invoke之前,要在Interceptor之后調(diào)用的內(nèi)容都寫在調(diào)用invok

11、e方法之后。*/OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException/TODOAuto-generatedmethodstub/* 該方法也是需要當(dāng)前對應(yīng)的Interceptor的preHandle方法的返回值為true時才會執(zhí)行。該方法將在整個請求完成之后,也就是DispatcherServlet渲染了視圖執(zhí)行,* 這個方法的主要作用是用于清理資源的,當(dāng)然這個方法也只能在當(dāng)

12、前這個Interceptor的preHandle方法的返回值為true時才會執(zhí)行。*/OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException/TODOAuto-generatedmethodstub(二)實現(xiàn)WebRequestInterceptor接口WebRequestInterceptor中也定義了三個方法,我們也是通過這三個方法來實現(xiàn)攔截的。這三個方法都傳遞了同一個參數(shù)WebReque

13、st,那么這個WebRequest是什么呢?這個WebRequest是Spring定義的一個接口,它里面的方法定義都基本跟HttpServletRequest一樣,在WebRequestInterceptor中對WebRequest進(jìn)行的所有操作都將同步到HttpServletRequest中,然后在當(dāng)前請求中一直傳遞。(1)preHandle(WebRequestrequest)方法。該方法將在請求處理之前進(jìn)行調(diào)用,也就是說會在Controller方法調(diào)用之前被調(diào)用。這個方法跟HandlerInterceptor中的preHandle是不同的,主要區(qū)別在于該方法的返回值是void,也就是沒有

14、返回值,所以我們一般主要用它來進(jìn)行資源的準(zhǔn)備工作,比如我們在使用hibernate的時候可以在這個方法中準(zhǔn)備一個Hibernate的Session對象,然后利用WebRequest的setAttribute(name,value,scope)把它放到WebRequest的屬性中。這里可以說說這個setAttribute方法的第三個參數(shù)scope,該參數(shù)是一個Integer類型的。在WebRequest的父層接口RequestAttributes中對它定義了三個常量:SCOPE_REQUEST:它的值是0,代表只有在request中可以訪問。SCOPE_SESSION:它的值是1,如果環(huán)境允許的

15、話它代表的是一個局部的隔離的session,否則就代表普通的session,并且在該session范圍內(nèi)可以訪問。SCOPE_GLOBAL_SESSION:它的值是2,如果環(huán)境允許的話,它代表的是一個全局共享的session,否則就代表普通的session,并且在該session范圍內(nèi)可以訪問。(2)postHandle(WebRequestrequest,ModelMapmodel)方法。該方法將在請求處理之后,也就是在Controller方法調(diào)用之后被調(diào)用,但是會在視圖返回被渲染之前被調(diào)用,所以可以在這個方法里面通過改變數(shù)據(jù)模型ModelMap來改變數(shù)據(jù)的展示。該方法有兩個參數(shù),WebRe

16、quest對象是用于傳遞整個請求數(shù)據(jù)的,比如在preHandle中準(zhǔn)備的數(shù)據(jù)都可以通過WebRequest來傳遞和訪問;ModelMap就是Controller處理之后返回的Model對象,我們可以通過改變它的屬性來改變返回的Model模型。(3)afterCompletion(WebRequestrequest,Exceptionex)方法。該方法會在整個請求處理完成,也就是在視圖返回并被渲染之后執(zhí)行。所以在該方法中可以進(jìn)行資源的釋放操作。而WebRequest參數(shù)就可以把我們在preHandle中準(zhǔn)備的資源傳遞到這里進(jìn)行釋放。Exception參數(shù)表示的是當(dāng)前請求的異常對象,如果在Cont

17、roller中拋出的異常已經(jīng)被Spring的異常處理器給處理了的話,那么這個異常對象就是是null。下面是一個簡單的代碼說明:importorg.springframework.ui.ModelMap;importorg.springframework.web.context.request.WebRequest;importorg.springframework.web.context.request.WebRequestInterceptor;publicclassAllInterceptorimplementsWebRequestInterceptor/*在請求處理之前執(zhí)行,該方法主要是

18、用于準(zhǔn)備資源數(shù)據(jù)的,然后可以把它們當(dāng)做請求屬性放至1JWebRequest中*/OverridepublicvoidpreHandle(WebRequestrequest)throwsException/TODOAuto-generatedmethodstubSystem.out.println("AllInterceptor");request.setAttribute("request","request",WebRequest.SCOPE_REQUEST);這個是放至Urequest范圍內(nèi)的,所以只能在當(dāng)前請求中的request

19、中獲取到request.setAttribute("session","session",WebRequest.SCOPE_SESSION);/這個是放至Usession范圍內(nèi)的,如果環(huán)境允許的話它只能在局部的隔離的會話中訪問,否則就是在普通的當(dāng)前會話中可以訪問request.setAttribute("globalSession","globalSession",WebRequest.SCOPE_GLOBAL_SESSION);/如果環(huán)境允許的話,它能在全局共享的會話中訪問,否則就是在普通的當(dāng)前會話中訪問/*該方

20、法將在Controller執(zhí)行之后,返回視圖之前執(zhí)行,ModelMap表示請求Controller處理之后返回的Model對象,所以可以在*這個方法中修改ModelMap的屬性,從而達(dá)到改變返回的模型的效果。*/OverridepublicvoidpostHandle(WebRequestrequest,ModelMapmap)throwsException/TODOAuto-generatedmethodstubfor(Stringkey:map.keySet()System.out.println(key+"");map.put("name3",&q

21、uot;value3");map.put("name1","name1");/*該方法將在整個請求完成之后,也就是說在視圖渲染之后進(jìn)行調(diào)用,主要用于進(jìn)行一些資源的釋放*/OverridepublicvoidafterCompletion(WebRequestrequest,Exceptionexception)throwsException/TODOAuto-generatedmethodstubSystem.out.println(exception+"-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="

22、);二、把定義的攔截器類加到SpringMVC的攔截體系中1.在SpringMVC的配置文件中加上支持MVC的schemaxmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/mvc /schema/mvc/spring-mvc-3.0.xsd"下面是我的聲明示例:<beansxmlns=&quo

23、t;/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:mvc="/schema/mvc"xsi:schemaLocation="/s

24、chema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd/schema/mvc/schema/mvc/spring-mvc-3.0.xsd">這樣在SpringMVC的配置文件中就可以使用mvc標(biāo)簽了,mvc標(biāo)簽中有一個mvc:interceptors是用于聲明SpringMVC的攔截器的。(二)使用mvc:interceptors標(biāo)簽來聲明需要加入到SpringMVC攔截器鏈中的攔截器<mvc:interceptors><!-使

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論