springmvc(3)攔截器HandlerInterceptor源碼的簡單解析


其實攔截器就是我們的AOP編程。攔截器在我們的實際項目中實用性比較大的,比如:日志記錄,權限過濾,身份驗證,性能監控等等。下面就簡單的來研究一下攔截器:

public interface HandlerInterceptor {
   

  //在處理器適配器執行前調用 前面講過 為各種處理器適配 通俗的講意思就是說在執行controller的方法
  //之前執行,返回true或者是false,true代表的是執行和面的邏輯,即執行后面的處理器或者攔截器

   boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception;

    //在執行完適配的調用方法后,生成視圖之前執行,官方是這樣解析的:
    // but before the DispatcherServlet renders the view.

    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;
  //在所以的操作以后執行
    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;

很明顯的看出來這是一個接口,我們在平時使用的時候,也是直接實現接口的方式的,具體每一個方法的作用也都將了一下,為了更好了理解這幾個方法調用的時機,我們來進行測試一下:

攔截器:

public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("<===========preHandle=============>"+System.currentTimeMillis());
        return true;
    }
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("<===========postHandle=============>"+System.currentTimeMillis());
        
    }
    
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("<===========afterCompletion=============>"+System.currentTimeMillis());
        
    }

controller:

protected ModelAndView handleRequestInternal(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        ModelAndView mv=new ModelAndView();
        System.out.println("Controller"+System.currentTimeMillis());
        mv.setViewName("index");
        return mv;
    }

jsp:

<%
long endTime=System.currentTimeMillis();
System.out.println("Jsp:"+endTime);
%>

執行完以后控制台打印:

<===========preHandle=============>1451574182055
Controller1451574182055
<===========postHandle=============>1451574182055
Jsp:1451574182179
<===========afterCompletion=============>1451574182179

這也驗證了上面說法。

也許會有這樣的疑惑,業務需求可能只需要繼承一個方法,那怎么辦,看其他幾個比較煩人(處女座)。這時候我們就可以通過繼承HandlerInterceptorAdapter 這個抽象類了,

這個不用解釋了吧,你可以選擇繼承任意幾個來完成自己的業務邏輯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM