1、定义
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
2、定义拦截器
2.1、定义一个类
实现HandlerInterceptor
接口,如下:
public class Interceptor1 implements HandlerInterceptor {
/**
* controller执行前调用此方法
* 返回true表示继续执行,返回false中止执行
* 这里可以加入登录校验、权限拦截等
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor1 preHandle......");
// 在handle执行之前执行此方法。
//返回值:如果返回true,放行
//返回值:如果返回false,拦截
return true;
}
/**
* controller执行后但未返回视图前调用此方法
* 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//handle执行之后,返回ModelAndView之前。
System.out.println("Interceptor1 postHandle......");
}
/**
* controller执行后且视图返回后调用此方法
* 这里可得到执行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、配置全局拦截器
在springmvc配置文件中:
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 按照配置的顺序执行 -->
<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、拦截器总结
preHandle
按拦截器定义顺序调用
postHandler
按拦截器定义逆序调用
afterCompletion
按拦截器定义逆序调用
postHandler
在拦截器链内所有拦截器返回成功时调用
afterCompletion
只有preHandle返回true才调用
2.4、防止拦截静态资源
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
等,只拦截请求不拦截静态资源。
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 按照配置的顺序执行 -->
<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>
网友评论