阻拦器:对央求在handler【Controller】前后停止处置。
四、执行顺序不同
同时配置了过滤器和阻拦器的情形:
MyFilter1 前
MyFilter2 前
MyInterceptor1 在Controller前执行
MyInterceptor2 在Controller前执行
controller办法执行...
MyInterceptor2 Controller之后,视图渲染之前
MyInterceptor1 Controller之后,视图渲染之前
MyInterceptor2 视图渲染完成之后执行
MyInterceptor1 视图渲染完成之后执行
MyFilter2 后
MyFilter1 后
过滤器的顺序
每一次都将chain对象传入,到达最后接口回调的效果:
阻拦器的顺序
preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterComplention1preHandle按照注册顺序,后两个与注册顺序相反。
一个阻拦器的preHandle为false,则之后的一切阻拦器都不会执行。
一个阻拦器的preHandle为true,则这个阻拦器的triggerAfterCompletion一定会执行。
只要一切的阻拦器preHandler都为true,也就是正常执行,postHandle才会执行。
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerInterceptor[] interceptors = getInterceptors(); if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i]; //一旦以后阻拦器preHandle的前往值为false,那么从上一个可用的阻拦器的afterCompletion末尾
if (!interceptor.preHandle(request, response, this.handler)) {
triggerAfterCompletion(request, response, null);
return false; //这里前往false意为 后续不停止下去了。
} this.interceptorIndex = i;//interceptorIndex初始化为-1,只要以后阻拦器preHandle为true,才会赋值以后的i。
} } return true;
}void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv) throws Exception { HandlerInterceptor[] interceptors = getInterceptors(); if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = interceptors.length - 1; i >= 0; i--) {
HandlerInterceptor interceptor = interceptors[i]; interceptor.postHandle(request, response, this.handler, mv);
} }}void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex) throws Exception { HandlerInterceptor[] interceptors = getInterceptors(); for (int i = this.interceptorIndex; i >= 0; i--)
}
五、控制执行顺序方式不同
两者默许都是运用注册顺序,假设想要以为控制执行的顺序,方式略有不同:
过滤器假设想要强迫改动,可以运用@Order注解。
阻拦器假设运用order()办法
@Order(2)
@Component
public class MyFilter1 implements Filter {}
@Component
public class WebAdapter implements WebMvcConfigurer {
@Autowired
MyInterceptor1 myInterceptor1; @Autowired
MyInterceptor2 myInterceptor2; @Override
(责任编辑:admin)