zoukankan      html  css  js  c++  java
  • 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());
        }
    }
    监听器配置
  • 相关阅读:
    二十几岁的事情之一,缩小理想!
    mysql数据库建表分类字段--尽量少用字符串--原因探索
    Linux 提升逼格之 命令别名 分享
    git 认证问题之一的解决 : http ssh 互换
    rabbitmqctl 命令整理
    golang 用defer 捕获error 需小心
    Linux 常用命令 随口说
    随便记录几个点
    喜鹊开发者(The Magpie Developer)
    主流开放平台接口说明
  • 原文地址:https://www.cnblogs.com/Lin-Ff2394/p/11766070.html
Copyright © 2011-2022 走看看