区分
Filter | 拦截器 |
---|---|
servlet容器 | spring |
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
过滤器的执行更早
拦截器
自定义拦截器继承自HandlerInterceptorAdapter类
(1)preHandler:controller之前调用
(2)postHandler:controller之后调用
(3)afterCompletion:controller之前,且preHandler返回true时才调用
(4)afterConcurrentHandlingStarted:没有先后,写在finally块中,主要用于清理线程变量(清理ThreadLocal)
public class BaseInterceptor implements HandlerInterceptor{
/**
* 在DispatcherServlet之前执行
* */
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("BaseInterceptor preHandle executed");
return true;
}
/**
* 在controller执行之后的DispatcherServlet之后执行
* */
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
System.out.println("BaseInterceptor postHandle executed");
}
/**
* 在页面渲染完成返回给客户端之前执行
*/
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
System.out.println("BaseInterceptor afterCompletion executed");
}
}
拦截器链
定义 拦截器链
@Component
public class ProjectInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle111...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle111...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion111...");
}
}
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor1 interceptor1;
@Autowired
private ProjectInterceptor2 interceptor2;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor1).addPathPatterns("/books", "/books/*");
registry.addInterceptor(interceptor2).addPathPatterns("/books", "/books/*");
}
}