1. 程式人生 > >ssm 攔截器

ssm 攔截器

1.DispatcherServlet

SpringMVC具有統一的入口DispatcherServlet,
DispatcherServlet是ssm框架前置控制器,所有的請求都通過DispatcherServlet。配置在web.xml檔案中的。攔截匹配的請求,Servlet攔截匹配規則可以自己定義,定義規則可以上網查,這裡不一一敘述了,把攔截下來的請求,首先進入方法doDispatch(HttpServletRequest request, HttpServletResponse response)經過一系列步奏,找到你要請求的目標Controller,最後交給他處理(沒有其他的攔截器)來處理。如果沒有handle處理器就會返回去,不再執行後面,所以說能攔截jsp頁面,JS等靜態資源,但是不能處理(缺陷解決在下面)。

那麼在web.xml配置如下:

2.自定義攔截器

那麼自定義攔截器又是怎麼實現的了,和前置攔截器有什麼關係了?

首先請求通過統一入口進入DispatcherServlet,再DispatcherServlet裡面有個方法尋找這個這個請求的處理器和Interceptor,這時候就會尋找到HandlerInterceptor 介面,或者是這個類繼承實現了HandlerInterceptor 介面的類,就會找到你自定義的攔截器,繼承HandlerInterceptor 有是三個方法,preHandle , postHandle 和 afterCompletion,preHandle 在業務處理器處理請求之前被呼叫,然後處理完請求就會呼叫postHandle,或者在檢視渲染之前呼叫它,最後請求執行完,檢視渲染完呼叫,DispatcherServlet完全處理完請求後被呼叫afterCompletion,可用於清理資源,如果定義多個攔截器,先定義的攔截器先執行preHandle,但是沒有另外的兩個方法,而是等待其他攔截器執行prehandle方法,知道最後一個攔截器執行完畢,也是從最後一個攔截器逆序執行這兩個方法。

舉個栗子:  自定義攔截器類處理未登入問題

注意:在login頁面操作要放過
在spring-mvc.xml配置自定義的攔截器:

3-filter

spring mvc的攔截器只攔截controller不攔截jsp,html 頁面檔案,如果想要攔截那怎麼辦?

可以利用用過濾器filter,filter是在servlet前執行的,所以先執行filter後執行攔截器。訪問頁面時都進行過濾驗證,如果存在該使用者session,則訪問該頁面,否則跳轉到登陸頁面登入,儲存session後訪問其它頁面,具體實現如下:

上面是具體實現,在web.xml配置如下: