實現登陸驗證的第二種方式:Interceptor
還是直接用例子來說明吧
1)定義一個攔截器,攔截器必須實現HandlerInterceptor接口,并且實現接口中的方法
攔截器:LoginInterceptor.java
/**
* 自定義登陸攔截器
* @author hetiantian
* @version 2017/11/6.
*/
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//根據用戶是否有登錄賬號進行攔截
//如果有,則跳轉到需要進行驗證的控制層中,否則需要登錄
Object administrator = httpServletRequest.getSession().getAttribute("loginAccount");
if (administrator == null) {
System.out.println("尚未登陸,跳轉到登錄頁面");
httpServletResponse.sendRedirect("/login.html");
return false;
}
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterComplete");
}
}
對HandlerInterceptor接口中的方法進行詳細說明
1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法。該方法在請求處理前進行調用。SprigMVC中的Interceptor的調用都是鏈式的,在一個應用中或者在一個請求中可以同時存在多個interceptor,每個interceptor的調用會根據它的聲明順序依次執行,而且最先執行的都是interceptor的preHandle方法,所以可以在這個方法中進行一些初始化操作或者對當前的請求進行一個預處理,也可以在這個方法中進行一些判斷來決定請求是否繼續執行下去,如果該方法返回false,表示請求結束,后續的interceptor和Controller都不會在繼續執行。當返回true時,會調用下一個interceptor的preHandle()方法,如果是最后一個interceptor時,就會調用當前請求的Controller方法
2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法。該方法在當前對應的interceptor的preHandle方法的返回值為true時才會執行 ,在controller方法調用執行之后,在dispatcher進行視圖返回渲染之前被調用。所以可以在這個方法中對controller處理后的modelview對象進行操作。。postHandle 方法被調用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執行,這和Struts2 里面的Interceptor 的執行過程有點類型。Struts2 里面的Interceptor 的執行過程也是鏈式的,只是在Struts2 里面需要手動調用ActionInvocation 的invoke 方法來觸發對下一個Interceptor 或者是Action 的調用,然后每一個Interceptor 中在invoke 方法調用之前的內容都是按照聲明順序執行的,而invoke 方法之后的內容就是反向的。
3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法。該方法在當前對應的interceptor的preHandle方法的返回值為true時才會執行,該方法在整個請求結束以后才會執行,也就是在DispatcherServlet 渲染了對應的視圖之后執行。該方法的主要作用是用于資源的清理。類似與Filter中的destroy()方法
2)在spring配置文件中配置攔截的url
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/administrator/**"/>
<bean class="com.cqupt.myproject.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
使用<mvc:interceptors>標簽來聲明需要加入到springmvc攔截器鏈中的攔截器
<mvc:mapping path=""/>指定攔截的url
<bean>指定使用哪個攔截器