Spring boot配置拦截器(Interceptor)和监听器(Listener)

先贴一段拦截器和监听器概念的文字(来自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
@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");
    }

}
SessionListener逻辑配置

 监听器配置,核心是是在继承WebMvcConfigurerAdapter类里注入Listener对应的Bean

public class WebApplicationConfig extends WebMvcConfigurerAdapter
{    @Bean
    public ServletListenerRegistrationBean<SessionListener> SessionListenerBean() {
        return new ServletListenerRegistrationBean<SessionListener>(new SessionListener());
    }
}
监听器配置

 

posted @ 2019-10-30 17:01  芳了个Fang  阅读(492)  评论(0编辑  收藏  举报