拦截器和过滤器
对比
1 过滤器只能在容器初始化被调用一次,而action周期中,拦截器可以被多次调用。
2 过滤器对所有请求起作用,拦截器只能对action起作用。
3 过滤器不能访问上下文,堆栈的对象。
4 过滤器依赖于servlet容器
5 过滤器基于函数回调,拦截器基于java反射。
6 过滤器不能获取ioc容器的bean,拦截器可以,拦截注入service,可以调用业务逻辑。
执行顺序
filter–interceptor.preHandle–handler–interceptor.postHandle–interceptor.afterCompletion–filter
拦截器
@Component
public class SampleInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("\n已经进入拦截器");
return true;
//return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("控制器执行完毕");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("得到结果"+response);
System.out.println("请求完毕\n");
}
}
配置类
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
SampleInterceptor sampleInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(sampleInterceptor).addPathPatterns("*/**").excludePathPatterns("/**/LoginController/**","/**/error")
.excludePathPatterns("/error");
WebMvcConfigurer.super.addInterceptors(registry);
}
}
拦截器场景
面向切面编程,符合横切关注点的功能都可以放在拦截器使用
登陆验证
权限验证
日志记录 记录请求操作日志,统计请求访问量。
处理cookie
性能监控,监控处理时长。
执行顺序考量
先定义拦截器先执行。
还可以通过order方法设置执行顺序,值越小越先执行。
过滤器
servlet的一个组件,实现用户访问某个资源前,对访问请求和响应进行过滤。
原理
基于函数回调,一个过滤器实例只能在容器初始化调用一次。
与拦截器区别
不能获取ioc容器的bean
Filter>>interceptor>>controllerAdvice>>aspect>>controller
实现过滤器方法
注解方式
@Order(2)
@WebFilter(filterName = "sampleFilterAnnotation",urlPatterns = {"/study/interfaces/v1/user/*"})
public class SampleFilterAnnotation implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化filter");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入过滤器前做的事");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("处理返回的response");
}
@Override
public void destroy() {
System.out.println("过滤器被销毁");
}
}
上面的参数,自行百度。
最后
配置完以上,需要在启动类加一个扫描包的注解,开启包扫描。
工具的使用学一下都很快,在什么场景下,怎么使用,这才是需要花费心思去琢磨的。