1.拦截器简介
-
拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
-
作用:
-
在指定的方法调用前后执行预先设定的代码
-
阻止原始方法的执行
-
总结:拦截器就是用来做增强
-
看完以后,大家会发现
-
拦截器和过滤器在作用和执行顺序上也很相似
所以这个时候,就有一个问题需要思考:拦截器和过滤器之间的区别是什么?
由上图,对Filter和Interceptor做个对比:
Filter技术 | Interceptor技术 | |
---|---|---|
技术范畴 | JavaWeb原生技术 | SpringMVC框架技术 |
拦截/过滤资源 | 可以对所有请求都过滤,包括任何Servlet,JSP,其他资源等 | 只对进入了SpringMVC管辖范围的才拦截,主要拦截Controller请求 |
执行时机 | 早于任何Servlet执行 | 晚于DispactherServlet执行 |
2.拦截器Intercept介绍
实现了HandlerInterceptor接口,且被Spring管理的Bean都是拦截器,接口定义如下:
public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}
HandlerInterceptor接口方法的作用及其参数,返回值详解如下:
作用 | 参数 | 返回值 | |
---|---|---|---|
preHandle | 对拦截到的请求进行预处理,返回true放行处理器方法,false不放行 | Hanlder是拦截到的Controller方法处理器 | 一旦返回false,代表终止向后执行,所有后置方法都不执行,之中方法只执行对应preHandler返回了true的 |
postHandle | 在处理器的方法执行后,对拦截到的请求进行后处理,可以在方法中对模型数据和视图进行修改 | Handler是拦截到的Controller方法处理器;modelAndView是返回的模型视图对象 | 无 |
afterCompletion | 视图渲染完成后(整个流程结束之后)进行最后的处理,如果请求流程中有异常,可以处理异常对象 | Handler是拦截到的Controller方法处理器;ex是异常对象 | 无 |
3.拦截器快速入门
1.编写MyInterceptor实现HandlerInterceptor接口:
package com.rocky.Interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("MyInterceptor is running ");return true; //是否放行 true 代表放行 false 代表不放行}@Overridepublic void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor is postHandle ");}@Overridepublic void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyInterceptor is afterCompletion ");}
}
2.在配置文件中配置Interceptor
<!--配置拦截器--><mvc:interceptors><mvc:interceptor><!--对哪些请求路径拦截--><mvc:mapping path="/**"/><bean class="com.rocky.Interceptor.MyInterceptor"></bean></mvc:interceptor></mvc:interceptors>
4.拦截器执行顺序
拦截器三个方法的执行顺序
1.当每个拦截器都是放行状态时,三个方法的执行顺序如下:
2.当Interceptor1和Interceptor2处于放行,Interceptor3处于不放行时,三个方法的执行顺序如下:
3.拦截器执行顺序取决于 interceptor 的配置顺序
<context:component-scan base-package="com.fly"/><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.rocky.interceptor.MyInterceptor02"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.rocky.interceptor.MyInterceptor01"></bean></mvc:interceptor></mvc:interceptors>