自定义过滤器实现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 注解
自定义拦截器实现,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);
}
}
Filter依赖于Serverlet容器,属于Serverlet的一部分,而Interceptor依赖于SpringMvc框架
Filter的生命周期由Serverlet容器管理,而Interceptor通过IOC来管理,可通过注入的方式获取bean。
Filter可拦截所有web资源(包括jsp,Serverlet,静态资源),而Interceptor只拦截controller。