目錄
一、實作原理
二、栗子
2.1 思路分析
2.2 代碼展示
2.3 結果展示
三、通配符
四、多個攔截器
4.1 第一個放行,第二個不放行
4.2 兩個都放行
4.3 第一個不放行,第二個則無效
一、實作原理
我們先回顧一下springMVC流程圖,前置控制器向處理器映射器發請求查找處理器後,傳回的是一個執行鍊(包括一系列的攔截器)。Spring MVC中攔截器類似于Servlet中的過濾器,用于對處理器的預處理或者後處理。其攔截器的接口是:HandlerInterceptor。
在企業開發,使用攔截器實作使用者認證(使用者登陸後進行身份校驗攔截),使用者權限攔截和方法性能監控等。
二、栗子
2.1 思路分析
方法一:
定義一個類,實作HandlerInterceptor接口。
- 定義一個類,實作HandlerInterceptor接口
- 實作接口的三個方法preHandle、postHandle、afterCompletion
- 配置核心檔案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>
2.3 結果展示
三、通配符
四、多個攔截器
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方法