您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    一脸懵逼,面试官:过滤器和阻拦器有啥区别?(2)
    时间:2020-09-14 12:57 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    阻拦器:对央求在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)