一、自定義攔截器
Spring MVC也可以使用攔截器對請求進行攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義的攔截器必須實現HandlerInterceptor接口。
二、HandlerInterceptor接口的三個方法
1.preHandler():
此方法在業務處理器(Controller)處理請求之前被調用。在此方法中可以對用戶請求request進行處理。
若返回值為true,則繼續調用后續的攔截器和目標方法。若返回值為false,則不會再調用后續的攔截器和目標方法。
* 常用來做權限。日志,事務等。
2.postHandler():
此方法在業務處理器處理完請求后,在DispatcherServlet向客戶端返回響應前(調用目標方法之后,渲染視圖之前)被調用,在該方法中對用戶請求request進行處理。
* 常用來對請求域中的屬性或視圖做出修改。
3.afterCompletion():
此方法在DispatcherServlet完全處理完請求后被調用
* 常用來做資源釋放
三、攔截器和過濾器在執行先后順序圖:
四、攔截器使用舉例
用戶登錄狀態檢查例子:通過用戶發送的請求,判斷用戶是否登錄,若未登錄則不允許訪問被保護資源
步驟:
1.創建攔截器類
一般攔截器類直接實現HandlerInterceptor接口,重寫HandlerInterceptor接口的三個方法就可以了,
但由於此處只需要用到 HandlerInterceptor接口的preHandler()方法,所以我們可以選擇繼承HandlerInterceptor接口的抽象實現類HandlerInterceptorAdapter,重寫其中的preHandler()方法。
在preHandler()方法中我們只需要從session中查詢用戶信息是否為null,就可以知道用戶是否已登錄了。
public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Admin admin = (Admin) session.getAttribute("loginAdmin"); if (admin == null){ throw new AccessForbiddenException("請登錄后再訪問!"); } return true; } }
2.注冊攔截器
在web.xml中注冊攔截器,配置需要攔截和不需要攔截的請求
<!--注冊攔截器--> <mvc:interceptors> <mvc:interceptor> <!--mvc:mapping配置要攔截的資源--> <!-- /* 對應一層路徑,比如:/aaa --> <!-- /** 對應多層路徑,比如:/aaa/bbb 或 /aaa/bbb/ccc 或 /aaa/bbb/ccc/ddd--> <mvc:mapping path="/**"/> <!--mvc:exclude- mapping配置不攔截的資源--> <!--去登陸頁面,不攔截--> <mvc:exclude-mapping path="/admin/to/login/page.html"/> <!--執行登陸操作,不攔截--> <mvc:exclude-mapping path="/admin/do/login.html"/> <!--執行退出登錄操作,不攔截--> <mvc:exclude-mapping path="/admin/do/Logout.html"/> <bean id="loginInterceptor" class="com.atguigu.crowd.mvc.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>