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

    这个是不久前在面试的时分遇到的一个成绩,事先直接懵了,两个单拎出来,虽然不太完全,但都大约知道可以对央求停止阻拦,放在一同比较,可真是头疼。

    其实之前面试完就去学习了一波,只不过那个时分没及时总结,如今总结一下,以免日后遇到这类成绩又给忘咯。

    要了解这类成绩,光靠融会贯串能够事先有用,过一阵子就差不多忘了。要想真的牢记,我们必需要实操一下。

    Filter的运用

    首先,要运用Filter,必须完成javax.servlet.Filter接口:

    public interface Filter { 

        //web运用加载进容器,Filter对象创立之后,执行init办法初始化,用于加载资源,只执行一次。  

        public default void init(FilterConfig filterConfig) throws ServletException {} 

        //每次央求或照应被阻拦时执行,可执行屡次。 

        public void doFilter(ServletRequest request, ServletResponse response, 

                FilterChain chain) throws IOException, ServletException; 

        //web运用移除容器,效劳器被正常封锁,则执行destroy办法,用于释放资源,只执行一次。 

        public default void destroy() {} 

    init和destroy是default办法,完成类可以不用完成。

    doFilter必须完成,也就是说,作为一个过滤器,doFilter必需要定义。

    doFlilter办法中传出去的FilterChain对象用来调用下一个过滤器。

    阻拦器的运用

    public interface HandlerInterceptor { 

        //阻拦handler的执行 --> 在HanlerMapping决议适宜的handler之后,[在HandlerAdater调用handler之前执行。] 

        default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 

                throws Exception {      return true

        }   //阻拦handler的执行 --> [在HandlerAdapter调用handler之后],在DispatcherServlet渲染视图之前执行 

        default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 

                @Nullable ModelAndView modelAndView) throws Exception { }   //视图渲染后调用,且只要preHandle结果为true,才会调用 

        default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, 

                @Nullable Exception ex) throws Exception {  }} 

     

    //DispatcherServlet 

    if (!mappedHandler.applyPreHandle(processedRequest, response)) { 

        return; //遍历一切的interceptors,调用preHandle办法,只要前往true,才能停止下去 

    // 这里也就是处置Contrller 

    mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 

    //视图渲染 

    applyDefaultViewName(processedRequest, mv); 

    //视图渲染之后调用 

    mappedHandler.applyPostHandle(processedRequest, response, mv); 

    过滤器与阻拦器究竟有啥区别呢?

    一、完成原理不同

    过滤器的完成基于回调函数

    阻拦器基于Java的反射机制【静态代理】完成。

    二、运用范围不同

    过滤器是Servlet的标准,需求完成javax.servlet.Filter接口,Filter运用需求依赖于Tomcat等容器。

    阻拦器是Spring组件,定义在org.springframework.web.servlet包下,由Spring容器管理【又有愈加丰厚的生缪那个周期处置办法,细粒度,且可以运用Spring中的资源】,不依赖Tomcat等容器。

    三、触发机遇不同

    这一段在HandlerInterceptor类的注释上可以发现,两者的触发机遇是不同的:

    一脸懵逼,面试官:过滤器和阻拦器有啥区别?

    过滤器:对央求在进入后Servlet之前或之后停止处置。

    (责任编辑:admin)