先贴一段拦截器和监听器概念的文字(来自https://www.jianshu.com/p/0d1f062dcd0d):
1、拦截器:
- 依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架;
- 在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用;
- 缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理;
- 由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。
2、监听器
- 实现了javax.servlet.ServletContextListener 接口的服务器端程序;
- 随web应用的启动而启动;
- 只初始化一次;
- 随web应用的停止而销毁;
- 主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。如SpringMVC的监听器org.springframework.web.context.ContextLoaderListener,实现了SpringMVC容器的加载、Bean对象创建、DispatchServlet初始化等。
进入主题:
1.拦截器的实现方法有两种 实现Interceptor 接口 或者 继承HandlerInterceptorAdapter类,实现接口需要实现其中所有方法,继承抽象类则一般实现preHandle方法即可。
例如我下面实现Interceptor接口的拦截器,状态码为404便重定向跳转到404页面
逻辑配置
@Component("errorPageInterceptor") public class ErrorPageInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if(statusCode!=null) { if (statusCode == response.SC_NOT_FOUND) { response.sendRedirect(request.getContextPath()+"/404.html"); return false; } } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
拦截器配置,核心是在继承WebMvcConfigurerAdapter类里重写addInterceptors方法
@Configuration public class HomeOpenHandlerConfigration extends WebMvcConfigurerAdapter { @Autowired @Qualifier("errorPageInterceptor") private HandlerInterceptor errorPageInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 registry.addInterceptor(errorPageInterceptor).addPathPatterns("/**"); super.addInterceptors(registry); } }
如此就可实现拦截器。
2.java web中Listener分为三大类:
ServletContextListener:监控servletContext的创建、销毁等。
HttpSessionListener:用来监控session的创建,销毁等
ServletRequestListener:用于监控servlet上下文request
下面我们来实现一个SessionListener
ServletContextListener:监控servletContext的创建、销毁等。
HttpSessionListener:用来监控session的创建,销毁等
ServletRequestListener:用于监控servlet上下文request
下面我们来实现一个SessionListener
@Component public class SessionListener implements HttpSessionListener { @Autowired private RedisTemplate redisTemplate; @Override public void sessionCreated(HttpSessionEvent event) { System.out.println("创建session"); } @Override public void sessionDestroyed(HttpSessionEvent event) { System.out.println("销毁session"); } }
监听器配置,核心是是在继承WebMvcConfigurerAdapter类里注入Listener对应的Bean
public class WebApplicationConfig extends WebMvcConfigurerAdapter { @Bean public ServletListenerRegistrationBean<SessionListener> SessionListenerBean() { return new ServletListenerRegistrationBean<SessionListener>(new SessionListener()); } }