一、过滤器的使用
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销毁
四、总结
过滤器:用于属性甄别,对象收集(不可改变过滤对象的属性和行为)
监听器:用于对象监听,行为记录(不可改变监听对象的属性和行为)
拦截器:用于对象拦截,行为干预(可以改变拦截对象的属性和行为)