SpringMVC拦截器介绍
(1)简介
(1)
interceptor
,
是springmvc提供的用来拦截请求的
(2)类似于Servlet的过滤器(Filter)。
(3)给某一些请求加一定处理。
(4)在springMVC中,所有的请求都会走到前端控制器中。拦截器配合前端控制对于某一些请求进行处理。
(5)经常用于权限验证、记录请求信息的日志、判断用户是否登录等。
(6)SpringMVC的拦截器是基于Spring AOP实现的。
(2)拦截器与过滤器的区别
filter,是javaEE 提供的用来拦截请求的,所有请求都能拦截
后者只能拦截控制器的方法

(3)拦截器的三个方法
HandlerInterceptor接口
执行顺序
单拦截器
(1)实现HandlerInterceptor接口
//1:实现一个接口HandlerInterceptor
public class Demo01Interceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
(2)重写preHandle,postHandle,afterCompletion方法
-
preHandle
在handler方法处理请求之前执行。该方法返回boolean类型数据,表示如果返回true,继续执行后面的方法,如果返回false,后面的方法都不会执行。
后面的方法指的是:(1)其他的拦截器的方法(2)该拦截器的方法。(3)请求的handler方法也不会执行。
总结:(1)如果拦截器的preHandle方法,返回false,那么其他拦截器的方法(preHandle,postHandle和afterCompletion)都不会执行。
(2)如果拦截器的preHandle方法,返回false,该拦截器的其他方法(postHandle和afterCompletion)都不会执行。例如:请求 /offer/saveOffer , prHandle方法里面的代码会在saveOffer方法执行之前执行。
(3)Controller中的方法也不会执行。
-
postHandle
在handler方法处理请求之后,返回ModelAndView之前执行。
-
afterCompletion
在完成请求之后执行。
(3)配置拦截器
在springMVC配置文件中配置。
-
(1)全局的拦截器配置
表示拦截所有的请求。
<mvc:interceptors>
<!-- 配置一个全局拦截器,拦截所有请求 -->
<bean class="interceptor.TestInterceptor"/>
</mvc:interceptors>
- (2)具体的路径拦截器
*配置拦截的路径
*配置执行的拦截器类。
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**"/>
<!-- 配置不需要拦截作用的路径 -->
<mvc:exclude-mapping path=""/>
<!-- 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="interceptor.Interceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/gotoTest"/>
<!-- 定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="interceptor.Interceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
多拦截器
(1)什么是多拦截器
应用软件可用配置很多个拦截器,不同的拦截器实现不同一个功能。
(2)开发多拦截器
和单拦截器相同,开发多个不同功能的拦截器。不同的功能实际上指的就是拦截器对于HandlerInceptor的三个方法的实现逻辑不同。
(3)配置多拦截器
-
配置全局的多拦截器
在mvc:interceptors 里面配置多个Bean.
-
配置某一路径的多拦截器
在mvc:interceptors里面配置多个mvc:interceptor。
- 在配置多个springMVC拦截器的时候,是有顺序的。按从上到下的顺序。
springmvc.xml
<!--拦截器使用第二步:配置拦截器-->
<mvc:interceptors>
<!--用于测试的拦截器-->
<mvc:interceptor>
<!--拦截路径的配置-->
<mvc:mapping path="/demo05.action"/>
<bean id="interceptor1" class="com.wzx.interceptor.Demo01Interceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!--拦截路径的配置-->
<mvc:mapping path="/demo05.action"/>
<bean id="interceptor2" class="com.wzx.interceptor.Demo02Interceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!--拦截路径的配置-->
<mvc:mapping path="/demo05.action"/>
<bean id="interceptor3" class="com.wzx.interceptor.Demo03Interceptor"/>
</mvc:interceptor>
</mvc:interceptors>
(4)多拦截器的执行流程
总结:
- (1)拦截器的顺序与springMVC中配置的拦截器顺序相同。
- (2)先执行第一个拦截器的preHandle方法。如果preHandle1返回true。执行拦截器2的preHanle2。所有的PreHandle方法执行完了以后,并且都是true,才会执行Controller的对应方法。
- (3)Controller的方法执行完了以后,先执行后面的拦截器的posthandle方法。如上图所示,先执行postHandle2,再执行postHandle1。
- (4)执行完所有的拦截器的postHandle方法后,controller返回ModelAndView。
- (5)Controller处理完请求以后,再执行后面的拦截器的afterCompletion方法。如上图所示,先执行afterCompletion2,再执行afterCompletion1.