1臣咖、定義
Spring Web MVC 的處理器攔截器類似于Servlet 開發(fā)中的過濾器Filter跃捣,用于對處理器進(jìn)行預(yù)處理和后處理。
2夺蛇、定義攔截器
2.1疚漆、定義一個類
實現(xiàn)HandlerInterceptor
接口,如下:
public class Interceptor1 implements HandlerInterceptor {
/**
* controller執(zhí)行前調(diào)用此方法
* 返回true表示繼續(xù)執(zhí)行刁赦,返回false中止執(zhí)行
* 這里可以加入登錄校驗娶聘、權(quán)限攔截等
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor1 preHandle......");
// 在handle執(zhí)行之前執(zhí)行此方法。
//返回值:如果返回true截型,放行
//返回值:如果返回false趴荸,攔截
return true;
}
/**
* controller執(zhí)行后但未返回視圖前調(diào)用此方法
* 這里可在返回用戶前對模型數(shù)據(jù)進(jìn)行加工處理,比如這里加入公用信息以便頁面顯示
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//handle執(zhí)行之后宦焦,返回ModelAndView之前发钝。
System.out.println("Interceptor1 postHandle......");
}
/**
* controller執(zhí)行后且視圖返回后調(diào)用此方法
* 這里可得到執(zhí)行controller時的異常信息
* 這里可記錄操作日志,資源清理等
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 返回ModelAndView之后波闹。
//可以在此處理異常
System.out.println("Interceptor1 afterCompletion......");
}
2.2酝豪、攔截器配置
2.2.1、 針對某種mapping配置
在springmvc配置文件中:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
2.2.2精堕、配置全局?jǐn)r截器
在springmvc配置文件中:
<!-- 配置攔截器 -->
<mvc:interceptors>
<!-- 按照配置的順序執(zhí)行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!-- 排除對js的攔截-->
<mvc:exclude-mapping path="/**/*.js"/>
<bean class="com.itheima.springmvc.interceptor.Interceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.itheima.springmvc.interceptor.Interceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
2.3孵淘、攔截器總結(jié)
preHandle
按攔截器定義順序調(diào)用
postHandler
按攔截器定義逆序調(diào)用
afterCompletion
按攔截器定義逆序調(diào)用
postHandler
在攔截器鏈內(nèi)所有攔截器返回成功時調(diào)用
afterCompletion
只有preHandle返回true才調(diào)用
2.4、防止攔截靜態(tài)資源
方案二和方案三只支持不在/WEB-INF/
下的靜態(tài)資源
2.4.1歹篓、方案一
在攔截器配置中添加<mvc:exclude-mapping path="/**/*.js"/>
如下:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--spring-mvc3.0以后才支持瘫证,spring-mvc3.0不支持-->
<mvc:exclude-mapping path="/**/*.js"/>
<bean class="cn.itheima.springmvc.interceptor.Interceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
2.4.2、方案二
在web.xml中對DispatcherServlet
添加:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
2.4.3庄撮、方案三
在springmvc配置文件中添加:
<!-- spring-mvc3.0后推薦 -->
<mvc:default-servlet-handler/>
2.4.4背捌、方案四
配置攔截器只攔截*.do
或者*.action
等,只攔截請求不攔截靜態(tài)資源洞斯。
<!-- 配置攔截器 -->
<mvc:interceptors>
<!-- 按照配置的順序執(zhí)行 -->
<mvc:interceptor>
<mvc:mapping path="/**/*.do"/>
<mvc:mapping path="/**/*.action"/>
<bean class="com.itheima.springmvc.interceptor.Interceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**/*.do"/>
<mvc:mapping path="/**/*.action"/>
<bean class="com.itheima.springmvc.interceptor.Interceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>