ssm 攔截器
阿新 • • 發佈:2019-02-13
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配置如下: