拦截器
拦截器的作用
Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
用户可以自己定义一些拦截器来实现特定的功能。
谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺 序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。 说到这里,可能大家脑海中有了一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但 是也有区别,接下来我们就来说说他们的区别:
过滤器是 servlet 规范中的一部分, 任何 java web 工程都可以使用。
拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp, html,css,image 或者 js 是不会进行拦截的。
它也是 AOP 思想的具体应用。
我们要想自定义拦截器, 要求必须实现: HandlerInterceptor 接口
自定义拦截器的步骤
编写类实现 HandlerInterceptor 接口
public class MyInterceptor 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 {
System.out.println("postHandle 方法执行了");
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion 方法执行了");
}
}
boolean preHandle方法:在调用controller方法之前执行。返回true时才会继续执行,如果有下一个拦截器则执行下一个拦截器,如果没有拦截器了则执行控制器方法。返回false则不会往下执行。
void postHandle方法:controller方法执行后,在向页面跳转之前执行,即返回ModelAndView之前执行。该方法可以修
改处理器方法的处理结果数据,且可以修改跳转方向
void afterCompletion方法:controller方法完全执行完,即页面跳转后执行。此时对 ModelAndView 再操作也对响应无济于事。可以在该方法中进行一些资源清理的操作
SpringMVC配置文件配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!--要拦截的URL,/** 表示拦截所有方法-->
<mvc:mapping path="/**"/>
<!--也可以配置哪些URL不拦截-->
<!--<mvc:exclude-mapping path="/test/*"/>-->
<bean id="myInterceptor" class="com.mg.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
多个拦截器
多个拦截器是按照配置的顺序决定的
编写两个拦截器类,并在配置文件中分别配置即可
拦截器类:
public class HandlerInterceptorDemo1 implements HandlerInterceptor {//三个方法}
public class HandlerInterceptorDemo2 implements HandlerInterceptor {//三个方法}
配置文件:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /><!-- 用于指定对拦截的 url -->
<bean id="handlerInterceptorDemo1"
class="com.mg.interceptor.HandlerInterceptorDemo1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean id="handlerInterceptorDemo2"
class="com.mg.interceptor.HandlerInterceptorDemo2"></bean>
</mvc:interceptor>
</mvc:interceptors>