![SpringMVC中使用Interceptor攔截器順序_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/4/38726d52-04e7-4e77-9899-6a8c5448746a/38726d52-04e7-4e77-9899-6a8c5448746a1.gif)
![SpringMVC中使用Interceptor攔截器順序_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/4/38726d52-04e7-4e77-9899-6a8c5448746a/38726d52-04e7-4e77-9899-6a8c5448746a2.gif)
![SpringMVC中使用Interceptor攔截器順序_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/4/38726d52-04e7-4e77-9899-6a8c5448746a/38726d52-04e7-4e77-9899-6a8c5448746a3.gif)
![SpringMVC中使用Interceptor攔截器順序_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/4/38726d52-04e7-4e77-9899-6a8c5448746a/38726d52-04e7-4e77-9899-6a8c5448746a4.gif)
![SpringMVC中使用Interceptor攔截器順序_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-4/4/38726d52-04e7-4e77-9899-6a8c5448746a/38726d52-04e7-4e77-9899-6a8c5448746a5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、SpringMVC中的Interceptor攔截器也是相當重要和相當有用的,它的主要作用是攔截用戶的請求并進行相應的處理。比如通過它來進行權限驗證,或者是來判斷用戶是否登陸,或者是像12306那樣子判斷當前時間是否是購票時間。一、定義Interceptor實現類SpringMVC中的Interceptor攔截請求是通過HandlerInterceptor來實現的。在SpringMVC中定義一個Interceptor非常簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實現了spring的HandlerInterceptor接口,或者是這個類繼承實現了HandlerInterc
2、eptor接口的類,比如Spring已經提供的實現了HandlerInterceptor接口的抽象類HandlerInterceptorAdapter;第二種方式是實現Spring的WebRequestInterceptor接口,或者是繼承實現了WebRequestInterceptor的類。(一)實現HandlerInterceptor接口HandlerInterceptor接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進行攔截處理的。(1)preHandle(HttpServletRequestrequest,HttpServletResponseresponse,Object
3、handle)方法,顧名思義,該方法將在請求處理之前進行調用。SpringMVC中的Interceptor是鏈式的調用的,在一個應用中或者說是在一個請求中可以同時存在多個Interceptor。每個Interceptor的調用會依據它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor中的preHandle方法,所以可以在這個方法中進行一些前置初始化操作或者是對當前請求的一個預處理,也可以在這個方法中進行一些判斷來決定請求是否要繼續(xù)進行下去。該方法的返回值是布爾值Boolean類型的,當它返回為false時,表示請求結束,后續(xù)的Interceptor和Controller都不會再執(zhí)行;
4、當返回值為true時就會繼續(xù)調用下一個Interceptor的preHandle方法,如果已經是最后一個Interceptor的時候就會是調用當前請求的Controller方法。(2)postHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,ModelAndViewmodelAndView)方法,由preHandle方法的解釋我們知道這個方法包括后面要說到的afterCompletion方法都只能是在當前所屬的Interceptor的preHandle方法的返回值為true時才能被調用。postH
5、andle方法,顧名思義就是在當前請求進行處理之后,也就是Controller方法調用之后執(zhí)行,但是它會在DispatcherServlet進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller處理之后的ModelAndView對象進行操作。postHandle方法被調用的方向跟preHandle是相反的,也就是說先聲明的Interceptor的postHandle方法反而會后執(zhí)行,這和Struts2里面的Interceptor的執(zhí)行過程有點類型。Struts2里面的Interceptor的執(zhí)行過程也是鏈式的,只是在Struts2里面需要手動調用ActionInvocati
6、on的invoke方法來觸發(fā)對下一個Interceptor或者是Action的調用,然后每一個Interceptor中在invoke方法調用之前的內容都是按照聲明順序執(zhí)行的,而invoke方法之后的內容就是反向的。(3)afterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,Exceptionex)方法,該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執(zhí)行。顧名思義,該方法將在整個請求結束之后,也就是在DispatcherServlet渲染
7、了對應的視圖之后執(zhí)行。這個方法的主要作用是用于進行資源清理工作的。下面是一個簡單的代碼說明:importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;publicclassSpringMVCInterceptorimplementsHandlerIntercept
8、or/* preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行調用,SpringMVC中的Interceptor攔截器是鏈式的,可以同時存在* 多個Interceptor,然后SpringMVC會根據聲明的前后順序一個接一個的執(zhí)行,而且所有的Interceptor中的preHandle方法都會在* Controller方法調用之前調用。SpringMVC的這種Interceptor鏈式結構也是可以進行中斷的,這種中斷方式是令preHandle的返* 回值為false,當preHandle的返回值為false的時候整個請求就結束了。*/Override
9、publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException/TODOAuto-generatedmethodstubreturnfalse;/* 這個方法只會在當前這個Interceptor的preHandle方法返回值為true的時候才會執(zhí)行。postHandle是進行處理器攔截用的,它的執(zhí)行時間是在處理器進行處理之* 后,也就是在Controller的方法調用之后執(zhí)行,但是它會在DispatcherServlet進行視圖的渲染之前執(zhí)行,也
10、就是說在這個方法中你可以對ModelAndView進行操*作。這個方法的鏈式結構跟正常訪問的方向是相反的,也就是說先聲明的Interceptor攔截器該方法反而會后調用,這跟Struts2里面的攔截器的執(zhí)行過程有點像,* 只是Struts2里面的intercept方法中要手動的調用ActionInvocation的invoke方法,Struts2中調用ActionInvocation的invoke方法就是調用下一個Interceptor* 或者是調用action,然后要在Interceptor之前調用的內容都寫在調用invoke之前,要在Interceptor之后調用的內容都寫在調用invok
11、e方法之后。*/OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException/TODOAuto-generatedmethodstub/* 該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執(zhí)行。該方法將在整個請求完成之后,也就是DispatcherServlet渲染了視圖執(zhí)行,* 這個方法的主要作用是用于清理資源的,當然這個方法也只能在當
12、前這個Interceptor的preHandle方法的返回值為true時才會執(zhí)行。*/OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException/TODOAuto-generatedmethodstub(二)實現WebRequestInterceptor接口WebRequestInterceptor中也定義了三個方法,我們也是通過這三個方法來實現攔截的。這三個方法都傳遞了同一個參數WebReque
13、st,那么這個WebRequest是什么呢?這個WebRequest是Spring定義的一個接口,它里面的方法定義都基本跟HttpServletRequest一樣,在WebRequestInterceptor中對WebRequest進行的所有操作都將同步到HttpServletRequest中,然后在當前請求中一直傳遞。(1)preHandle(WebRequestrequest)方法。該方法將在請求處理之前進行調用,也就是說會在Controller方法調用之前被調用。這個方法跟HandlerInterceptor中的preHandle是不同的,主要區(qū)別在于該方法的返回值是void,也就是沒有
14、返回值,所以我們一般主要用它來進行資源的準備工作,比如我們在使用hibernate的時候可以在這個方法中準備一個Hibernate的Session對象,然后利用WebRequest的setAttribute(name,value,scope)把它放到WebRequest的屬性中。這里可以說說這個setAttribute方法的第三個參數scope,該參數是一個Integer類型的。在WebRequest的父層接口RequestAttributes中對它定義了三個常量:SCOPE_REQUEST:它的值是0,代表只有在request中可以訪問。SCOPE_SESSION:它的值是1,如果環(huán)境允許的
15、話它代表的是一個局部的隔離的session,否則就代表普通的session,并且在該session范圍內可以訪問。SCOPE_GLOBAL_SESSION:它的值是2,如果環(huán)境允許的話,它代表的是一個全局共享的session,否則就代表普通的session,并且在該session范圍內可以訪問。(2)postHandle(WebRequestrequest,ModelMapmodel)方法。該方法將在請求處理之后,也就是在Controller方法調用之后被調用,但是會在視圖返回被渲染之前被調用,所以可以在這個方法里面通過改變數據模型ModelMap來改變數據的展示。該方法有兩個參數,WebRe
16、quest對象是用于傳遞整個請求數據的,比如在preHandle中準備的數據都可以通過WebRequest來傳遞和訪問;ModelMap就是Controller處理之后返回的Model對象,我們可以通過改變它的屬性來改變返回的Model模型。(3)afterCompletion(WebRequestrequest,Exceptionex)方法。該方法會在整個請求處理完成,也就是在視圖返回并被渲染之后執(zhí)行。所以在該方法中可以進行資源的釋放操作。而WebRequest參數就可以把我們在preHandle中準備的資源傳遞到這里進行釋放。Exception參數表示的是當前請求的異常對象,如果在Cont
17、roller中拋出的異常已經被Spring的異常處理器給處理了的話,那么這個異常對象就是是null。下面是一個簡單的代碼說明:importorg.springframework.ui.ModelMap;importorg.springframework.web.context.request.WebRequest;importorg.springframework.web.context.request.WebRequestInterceptor;publicclassAllInterceptorimplementsWebRequestInterceptor/*在請求處理之前執(zhí)行,該方法主要是
18、用于準備資源數據的,然后可以把它們當做請求屬性放至1JWebRequest中*/OverridepublicvoidpreHandle(WebRequestrequest)throwsException/TODOAuto-generatedmethodstubSystem.out.println("AllInterceptor");request.setAttribute("request","request",WebRequest.SCOPE_REQUEST);這個是放至Urequest范圍內的,所以只能在當前請求中的request
19、中獲取到request.setAttribute("session","session",WebRequest.SCOPE_SESSION);/這個是放至Usession范圍內的,如果環(huán)境允許的話它只能在局部的隔離的會話中訪問,否則就是在普通的當前會話中可以訪問request.setAttribute("globalSession","globalSession",WebRequest.SCOPE_GLOBAL_SESSION);/如果環(huán)境允許的話,它能在全局共享的會話中訪問,否則就是在普通的當前會話中訪問/*該方
20、法將在Controller執(zhí)行之后,返回視圖之前執(zhí)行,ModelMap表示請求Controller處理之后返回的Model對象,所以可以在*這個方法中修改ModelMap的屬性,從而達到改變返回的模型的效果。*/OverridepublicvoidpostHandle(WebRequestrequest,ModelMapmap)throwsException/TODOAuto-generatedmethodstubfor(Stringkey:map.keySet()System.out.println(key+"");map.put("name3",&q
21、uot;value3");map.put("name1","name1");/*該方法將在整個請求完成之后,也就是說在視圖渲染之后進行調用,主要用于進行一些資源的釋放*/OverridepublicvoidafterCompletion(WebRequestrequest,Exceptionexception)throwsException/TODOAuto-generatedmethodstubSystem.out.println(exception+"-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="
22、);二、把定義的攔截器類加到SpringMVC的攔截體系中1.在SpringMVC的配置文件中加上支持MVC的schemaxmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/mvc&nbsp;/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標簽了,mvc標簽中有一個mvc:interceptors是用于聲明SpringMVC的攔截器的。(二)使用mvc:interceptors標簽來聲明需要加入到SpringMVC攔截器鏈中的攔截器<mvc:interceptors><!-使
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025嶺南文化創(chuàng)意產業(yè)園項目啟動儀式籌辦服務合同協議書
- 2025含破碎錘挖掘機買賣合同書
- 2025咖啡粉批發(fā)合同
- 2025金屬制品委托加工合同
- 2023三年級英語上冊 Unit 5 Let's eat The first period第一課時說課稿 人教PEP
- 5 應對自然災害(說課稿)2023-2024學年統(tǒng)編版道德與法治六年級下冊
- 保母阿姨合同范例
- 人用工合同范例
- 上海檢測合同范例
- 2023七年級道德與法治上冊 第二單元 友誼的天空 第五課 交友的智慧第1框 讓友誼之樹常青說課稿 新人教版
- 中國心力衰竭診斷和治療指南2024解讀(完整版)
- 《鋼鐵是怎樣練成的》閱讀任務單及答案
- 新人教版高中數學必修第二冊第六章平面向量及其應用教案 (一)
- 湖南省長沙市一中2024-2025學年高一生物上學期期末考試試題含解析
- 碳纖維增強復合材料在海洋工程中的應用情況
- 公司市場分析管理制度
- 焊接材料制造工-國家職業(yè)標準(2024版)
- 江西省2024年中考數學試卷(含答案)
- 2024年200MW-400MWh電化學儲能電站設計方案
- 余土外運施工方案
- 中考英語1600詞匯對照表-(帶音標)
評論
0/150
提交評論