一、过滤器的使用
1.写一个类继承Filter
@WebFilter(filterName="myFilter",urlPatterns={"/*"}) public class AMyFilter2 implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("==========初始化过滤器A"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("=======进入过滤器2a"); filterChain.doFilter(servletRequest, servletResponse); //放行过滤器 } @Override public void destroy() { } }注意:拦截器执行的顺序与 filterName="myFilter" 的值有关,按字母排序
也可以通过@Order指定执行顺序,值越小,越先执行
2.启动类加上注解
@ServletComponentScan二、监听器的使用
1.写一个类继承ServletRequestListener
@WebListener public class myListen1 implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent servletRequestEvent) { System.out.println("监听器1销毁"); } @Override public void requestInitialized(ServletRequestEvent servletRequestEvent) { System.out.println("监听器1初始化"); } }2.启动类加上注解
@ServletComponentScan三、拦截器的使用
1.写一个类继承HandlerInterceptor
@Component public class MyInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("======请求前拦截器"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("======请求后调用拦截器"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("=======拦截器,请求调用完成后回调方法,即在视图渲染完成后回调"); } }2.写一个配置类注入拦截器
@Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter{ @Autowired MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //注册拦截器 拦截规则 //多个拦截器时 以此添加 执行顺序按添加顺序 registry.addInterceptor(getHandlerInterceptor()); } @Bean public static HandlerInterceptor getHandlerInterceptor() { return new MyInterceptor(); } }观察过滤器,监听器,拦截器的请求顺序
=======监听器1初始化 2019-05-25 11:42:11.586 INFO 7536 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet' 2019-05-25 11:42:11.586 INFO 7536 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2019-05-25 11:42:11.612 INFO 7536 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 26 ms =======进入过滤器2a =======进入过滤器 =======进入过滤器2 ======请求前拦截器 测试 ======请求后调用拦截器 =======拦截器,请求调用完成后回调方法,即在视图渲染完成后回调 =======监听器1销毁四、总结
过滤器:用于属性甄别,对象收集(不可改变过滤对象的属性和行为)
监听器:用于对象监听,行为记录(不可改变监听对象的属性和行为)
拦截器:用于对象拦截,行为干预(可以改变拦截对象的属性和行为)