过滤器和拦截器区别

过滤器和拦截器区别

Inteceptor Filter
所属包 在spring包 在javax包
属于哪个容器 属于web容器 属于spring容器
资源的使用 不能获取spring的资源 可以获取spring的资源
过滤先后
使用场景 和业务相关 如日志处理 统计 业务无关的公共代码 例如 设置编码

使用例子

@Configuration
public class MyConfig  implements WebMvcConfigurer {
    @Autowired
    MyInteceptor myInteceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInteceptor);
    }
}

@Configuration
public class MyInteceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器:执行 init 方法。");
    }
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器:开始执行 doFilter 方法。");
        // 请求放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("过滤器:结束执行 doFilter 方法。");
    }
    @Override
    public void destroy() {
        System.out.println("过滤器:执行 destroy 方法。");
    }
}
测试结果:
过滤器:开始执行 doFilter 方法。
preHandle
postHandle
afterCompletion
过滤器:结束执行 doFilter 方法。

总结:

Inteceptor的功能更加强大,因为可以获取spring的资源,优先使用拦截器

posted @ 2023-10-24 15:48  xiuer211  阅读(2)  评论(0编辑  收藏  举报