SpringMVC中攔截器的使用,
什麼是攔截器
攔截器通常一般指的是通過攔截從瀏覽器發往伺服器的一些請求來完成某些功能的一段程式碼
一般在一個請求發生之前,發生時,發生後我們都可以對請求進行攔截
攔截器可以做什麼
攔截器可以用於許可權驗證、解決亂碼、動作記錄記錄、效能監控、異常處理等
自訂攔截器
可以通過繼承Spring架構中的HandlerInterceptorAdapter類,然後重寫preHandle,postHandle,afterCompletion三個方法,在三個方法中寫我們自己要想實現的商務邏輯代碼.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
/** * 自訂攔截器 * @author admol */ public class MyInterceptor extends HandlerInterceptorAdapter { /** * 在請求之前執行 * @param request * @param response * @param handler 表示被攔截的請求目標 * @return false:攔截請求,終止請求 true:繼續執行請求 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //商務邏輯代碼編寫...(如:解決亂碼,許可權驗證) request.setCharacterEncoding("utf-8"); return true; }
/** * @param modelAndView 可以對視圖進行操作 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //商務邏輯代碼編寫...(如:動作記錄記錄,更改視圖資訊) }
/** * @param ex 異常 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //商務邏輯代碼編寫...(如:,資源銷毀,異常處理) } }
|
a) public boolean preHandle(HttpServletRequest request,HttpServletResponse response,
Object handler) throws Exception
該方法在action執行前執行,可以實現對資料的預先處理,比如:編碼、防重複提交安全控制等。
如果方法返回true,則繼續執行action。返回false則攔截請求
b) public void postHandle(HttpServletRequest request,HttpServletResponse response,
Object handler,ModelAndView modelAndView) throws Exception
該方法在action執行後,產生視圖前執行。在這裡,我們有機會修改視圖層資料。
c) public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
最後執行,通常用於釋放資源,處理異常。我們可以根據ex是否為空白,來進行相關的異常處理。
註冊攔截器
在xml檔案中配置:
1 2 3
|
<mvc:interceptors> <bean id="myInterceptor" class="com.admol.web.MyInterceptor" /> </mvc:interceptors>
|
當有多個攔截器的時候可以寫多個bean
當我們只想攔截部分指定請求時:
1 2 3 4 5
|
<mvc:interceptors> <!-- path:需要攔截的請求,不寫時會攔截所有請求 --> <mvc:mapping path="/*.htm" /> <bean id="myInterceptor" class="com.admol.web.MyInterceptor" /> </mvc:interceptors>
|
多個攔截器
xml配置:
1 2 3 4
|
<mvc:interceptors> <bean id="myInterceptor" class="com.admol.web.MyInterceptor" /> <bean id="myInterceptor2" class="com.admol.web.MyInterceptor2" /> </mvc:interceptors>
|
當配置有多個攔截器的時候,會按攔截器順序執行preHandle方法,然後再倒序執行postHandle和afterCompletion方法。
其他實現方式與過濾器的區別
1.過濾器是依賴於Servlet容器,基於回呼函數,Intercepto依賴與架構,基於反射機制
2.過濾器的過濾範圍更大,還可以過濾一些靜態資源,攔截器只攔截請求