Spring Mvc攔截器就是對web請求進行攔截處理。過濾非法和不和規則的請求,就像我們外地車如果進京,就需要辦進京證,但是對于一些違章行為的車,是沒辦法辦理進京證,是以這一部分車都被攔截,不能進京。 Spring MVC中的攔截器可以通過HandlerInterceptor接口和WebRequestInterceptor接口來實作。這一節我們來看看通過HandlerInterceptor的實作方法.
1.建立攔截器
我們建立一個攔截器類, 要繼承HandlerInterceptor接口,并實作HandlerInterceptor的三個方法。
preHandle:表示預處理,最新執行,傳回值為true,會繼續向下執行,傳回值為false則終止執行,後續的controller将不在執行
postHandle:就是對請求進行處理操作,會在調用controller方法之後執行,但是在傳回渲染視圖之前。
afterCompletion:該方法是在請求結束之後執行,也就是在渲染視圖之後執行,主要用于一些資源的清理工作。
public class firstInterpector implements HandlerInterceptor {
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
//該方法是在請求結束之後執行,也就是在渲染視圖之後執行,主要用于一些資源的清理工作。
System.out.println("afterCompletion");
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
//就是對請求進行處理操作,會在調用controller方法之後執行,但是在傳回渲染視圖之前。
System.out.println("postHandle");
}
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
//表示預處理,最新執行,傳回值為true,會繼續向下執行,傳回值為false則終止執行,後續的controller将不在執行
System.out.println("preHandle");
return true;
}
}
建立完攔截器類後,暫時還不能生效,需要進行配置。我們在dispatcher-servlet.xml添加攔截器配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- <mvc:annotation-driven conversion-service="myConverter"/> -->
<context:component-scan base-package="com.testone.Controller" />
<mvc:interceptors>
<bean class="com.interceptor.firstInterpector"></bean>
</mvc:interceptors>
</beans>
這樣我們啟動web網站,就可以看到輸出結果和執行順序了
preHandle
postHandle
afterCompletion
2.攔截器鍊
一個項目中可以有多個攔截器,如果有多個攔截器的話,執行順序會是神馬樣的,我們看看下面的例子。
public class firstInterpector implements HandlerInterceptor {
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
//該方法是在請求結束之後執行,也就是在渲染視圖之後執行,主要用于一些資源的清理工作。
System.out.println("firstInterpector--afterCompletion");
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
//就是對請求進行處理操作,會在調用controller方法之後執行,但是在傳回渲染視圖之前。
System.out.println("firstInterpector--postHandle");
}
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
//表示預處理,最新執行,傳回值為true,會繼續向下執行,傳回值為false則終止執行,後續的controller将不在執行
System.out.println("firstInterpector--preHandle");
return true;
}
}
public class secondInterpector implements HandlerInterceptor {
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("secondInterpector--afterCompletion");
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
System.out.println("secondInterpector--postHandle");
}
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("secondInterpector--preHandle");
return true;
}
}
<mvc:interceptors>
<bean class="com.interceptor.firstInterpector"></bean>
<bean class="com.interceptor.secondInterpector"></bean>
</mvc:interceptors>
啟動網站,執行結果如下
firstInterpector--preHandle
secondInterpector--preHandle
secondInterpector--postHandle
firstInterpector--postHandle
secondInterpector--afterCompletion
firstInterpector--afterCompletion
可能有些同學對這樣的輸出結果感到困惑,我們看下面的一幅圖就能明白了。
如果我們想對某個頁面進行一個特定的攔截,可以如下設定
<mvc:interceptors>
<!-- 在interceptors下面的是對所有的請求進行攔截 -->
<bean class="com.interceptor.firstInterpector"></bean>
<mvc:interceptor>
<!-- 在interceptor下面的是對特定請求進行攔截 -->
<mvc:mapping path="/Home/index"/>
<bean class="com.interceptor.secondInterpector"></bean>
</mvc:interceptor>
</mvc:interceptors>