springmvc攔截器

springmvc攔截器

攔截器的作用

springmvc提供攔截器實現對Handler進行面向切面編程,可以Handler執行之前、之後、之中添加代碼,這種方式就是切面編程。
攔截器相當 於一個過慮器,可以預處理、後處理等。

  • 使用攔截器實現:
    1、在Handler執行之前攔截校驗用戶權限,如果用戶沒有操作權限就不能繼續執行Handler.
    2、Handler執行完成後統一在攔截器中記錄操作日誌。

springmvc攔截器定義

springmvc提供HanlderInterceptor接口,實現該接口的就是攔截器。

public class HandlerInterceptor1 implements HandlerInterceptor {

    //執行時機:Handler執行之前去執行
    //使用場景:用於用戶權限攔截校驗
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        //返回 true表示不攔截即放行
        //返回false表示攔截,不再向後執行
        return false;
    }

    //執行時機:Handler執行未返回modelAndView之前 去執行
    //使用場景 :將頁面需要通用的信息通過modelAndView傳到頁面,比如:菜單 導航通用在此方法取出來傳到頁面
    //比如:統一定義視圖決定視圖轉向
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
    }

    //執行時機:Handler執行完成並且 將modelAndView返回
    //使用場景 :統一進行異常處理,統一記錄操作日誌。。。
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }
}

攔截器配置

  • 重點!!!springmvc的攔截器針對HandlerMapping處理器映射器配置的。

針對所有mapping配置全局攔截器:
springmvc中沒有全局攔截器概念,使用這種配置,springmvc將配置的攔截器分別注入到多個處理器映射器。

<!-- springmvc攔截器 -->
<mvc:interceptors>
    <!--多個攔截器,順序執行 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.bsw.mybatis.interceptor.HandlerInteceptor1"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.bsw.mybatis.interceptor.HandlerInteceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

實現對攔截器執行順序及流程的測試

  • 全都放行
    HandlerInterceptor1…preHandle
    HandlerInterceptor2…preHandle
    HandlerInterceptor2…postHandle
    HandlerInterceptor1…postHandle
    HandlerInterceptor2…afterCompletion
    HandlerInterceptor1…afterCompletion
    preHandle按照攔截器的順序執行
    postHandle和afterCompletion都是按照配置的攔截器逆順序執行
  • 攔截器1放行,攔截器2不放行
    HandlerInterceptor1…preHandle
    HandlerInterceptor2…preHandle
    HandlerInterceptor1…afterCompletion
    只要preHandle放行了,那麼就會執行對應攔截器的afterCompletion方法
    只要有一個攔截器的preHandle不放行,所有的攔截器的postHandle都不會執行
  • 都不放行
    HandlerInterceptor1…preHandle
    前邊的攔截器不放行,後邊攔截器不執行。

實現統一異常處理

定義一個攔截器,在afterCompletion實現異常處理。
必須要將此攔截器配置第一個位置,且preHandle要放行。

發佈了73 篇原創文章 · 獲贊 41 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章