1 过滤器

自定义过滤器实现filter接口

重写dofilter方法实现过滤逻辑

// 添加过滤的路径
@WebFilter(urlPatterns = {"/*"})
// 交个Spring管理
@Order(5)  
@Component
public class ByFilter2 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        Integer count = (Integer) request.getSession().getAttribute("count");
        count = Objects.isNull(count) ? 1 : ++count;
        System.out.println("高优先级的过滤器统计"+count);
        request.getSession().setAttribute("count",count);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

如果是传统servlet项目,需要在启动类添加@ServletComponentScan 注解

2 拦截器

自定义拦截器实现,handleinterceptor接口,实现拦截方法

public class MyIntercptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Integer count = (Integer) request.getSession().getAttribute("count");
        count = Objects.isNull(count) ? 1 : ++count;
        System.out.println("高优先级的过滤器统计"+count);
        request.getSession().setAttribute("count",count);
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
}

创建配置类,实现WebMvcConfigurer接口。重写addInterceptors方法

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyIntercptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

3 总结

Filter依赖于Serverlet容器,属于Serverlet的一部分,而Interceptor依赖于SpringMvc框架

Filter的生命周期由Serverlet容器管理,而Interceptor通过IOC来管理,可通过注入的方式获取bean。

Filter可拦截所有web资源(包括jsp,Serverlet,静态资源),而Interceptor只拦截controller。