1. 程式人生 > >Spring MVC攔截器詳解

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 {

   }

}