天天看點

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

目錄

一、實作原理

二、栗子

2.1 思路分析

2.2 代碼展示 

2.3 結果展示

三、通配符

四、多個攔截器

4.1 第一個放行,第二個不放行

4.2 兩個都放行

4.3 第一個不放行,第二個則無效

一、實作原理

我們先回顧一下springMVC流程圖,前置控制器向處理器映射器發請求查找處理器後,傳回的是一個執行鍊(包括一系列的攔截器)。Spring MVC中攔截器類似于Servlet中的過濾器,用于對處理器的預處理或者後處理。其攔截器的接口是:HandlerInterceptor。

 在企業開發,使用攔截器實作使用者認證(使用者登陸後進行身份校驗攔截),使用者權限攔截和方法性能監控等。

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

二、栗子

2.1 思路分析

方法一:

定義一個類,實作HandlerInterceptor接口。

  1. 定義一個類,實作HandlerInterceptor接口
  2. 實作接口的三個方法preHandle、postHandle、afterCompletion
  3. 配置核心檔案dispatch-servlet.xml

preHandle:進入處理器之前執行,攔截作用。通常用于身份認證、授權。

postHandle:進入控制器之後,傳回ModelAndView之前。從ModelAndView出發 ,可以傳資料到頁面,可以指定統一的視圖,比如淘寶的菜單欄導航。

afterCompletion:控制器執行完之後。通常用于異常處理、日志處理。

方法二:

繼承實作了HandlerInterceptor接口的類,比如Spring已經提供的實作了HandlerInterceptor接口的抽象類HandlerInterceptorAdapter。

2.2 代碼展示 

MyInterceptor.java

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before......");
        return true;//放行
//        return false;//不放行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("being......");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after......");
    }
}
           

dispatch-servlet.xml

<!--攔截器配置-->
    <mvc:interceptors>
        <!--一個攔截器-->
        <mvc:interceptor>
            <!--所有目錄下的*.do-->
            <mvc:mapping path="/**"/>
            <!--登入不能攔截-->
            <mvc:exclude-mapping path="/**/login.do"></mvc:exclude-mapping>
            <!--new MyInterceptor()-->
            <bean class="com.jc.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
           
SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

2.3 結果展示

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

三、通配符

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

四、多個攔截器

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

MyInterceptor2.java 

public class MyInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before2......");
        return false;//不放行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("being2......");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after2......");
    }
}
           

4.1 第一個放行,第二個不放行

隻要有一個不放行,就不會執行postHandle方法

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

4.2 兩個都放行

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器

4.3 第一個不放行,第二個則無效

SpringMVC學習筆記(八)--攔截器一、實作原理二、栗子三、通配符四、多個攔截器