Spring MVC攔截器詳解
SpringMVC攔截器
1 定義
java裡的攔截器是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-OrientedProgramming)中攔截器用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。SpringMVC 中的Interceptor 攔截器的主要作用是攔截使用者的請求並進行相應的處理。比如通過它來進行許可權驗證,或者是登入認證等。
2 自定義攔截器
這裡詳解通過實現HandleInterceptor介面的方法。新建一個HandlerInterceptor的實現類,程式碼如下,該實現類中包括三個方法:
1)preHandle方法:該方法在controller執行前被呼叫,返回true表示繼續執行,返回false表示終止執行。登入校驗、許可權攔截等可以寫在此方法中。
2)postHandle方法:該方法在controller執行後但未返回ModelAndView之前被呼叫。一些公用資訊可以被寫在此方法中方便頁面顯示。
3)afterCompletion方法:該方法在controller執行完成後且已返回ModelAndView之後被呼叫。日誌記錄、異常返回等可寫在此方法中。
Public class HandlerInterceptorCustomimplements HandlerInterceptor{
@Override
Public boolean preHandle(HttpServletRequestrequest,
HttpServletResponseresponse, Object handler) throws Exception {
// TODO Auto-generated method stub
Return false;
}
@Override
Public void postHandle(HttpServletRequestrequest,
HttpServletResponseresponse, Object handler,
ModelAndView modelAndView)throws Exception {
// TODO Auto-generated method stub
}
@Override
Public void afterCompletion(HttpServletRequestrequest,
HttpServletResponseresponse, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
3 攔截器配置
配置檔案新增如下程式碼:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptorCustom"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptorCustom2"></bean>
</mvc:interceptor>
</mvc:interceptors>
4 登入認證攔截器程式碼
public class LoginInterceptor implements HandlerInterceptor {
//進入 Handler方法之前執行
//用於身份認證、身份授權
//比如身份認證,如果認證通過表示當前使用者沒有登陸,需要此方法攔截不再向下執行
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Objecthandler)throws Exception {
//獲取請求的url
String url = request.getRequestURI();
//判斷url是否是公開地址(實際使用時將公開地址配置配置檔案中)
//這裡公開地址是登陸提交的地址
if(url.indexOf("login.action")>=0){
//如果進行登陸提交,放行
return true;
}
//判斷session
HttpSession session = request.getSession();
//從session中取出使用者身份資訊
String username = (String)session.getAttribute("username");
if(username !=null){
//身份存在,放行
return true;
}
//執行這裡表示使用者身份需要認證,跳轉登陸頁面
request.getRequestDispatcher("adminLogin.jsp").forward(request,response);
//return false表示攔截,不向下執行
//return true表示放行
return false;
}
//進入Handler方法之後,返回modelAndView之前執行
//應用場景從modelAndView出發:將公用的模型資料(比如選單導航)在這裡傳到檢視,也可以在這裡統一指定檢視
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Objecthandler,
ModelAndView modelAndView)throws Exception {
}
//執行Handler完成執行此方法
//應用場景:統一異常處理,統一日誌處理
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Objecthandler, Exceptionex)
throws Exception {
}
}