zoukankan      html  css  js  c++  java
  • SpringBoot开发案例之拦截器注入Bean

    前言

    由于业务需要,需要在拦截器中操作Redis缓存,按照 controller,service层配置发现无法注入,一直报空指针异常。

    解决方案

    @Configuration
    public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
     
        /**
          * 将自定义拦截器作为Bean写入配置
          * @return
          */
         @Bean
         public SysInterceptor sysInterceptor() {
          return new SysInterceptor();
         }
         /**
          * 对拦截器注册
          */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            String[] patterns = new String[] {"/swagger-resources/**"};
            registry.addInterceptor(sysInterceptor())
                                     .addPathPatterns("/**")
                                     .excludePathPatterns(patterns);
            super.addInterceptors(registry);
        }
    }

    拦截器:

    public class SysInterceptor  implements HandlerInterceptor {
        
        private static final Logger logger = LoggerFactory.getLogger(SysInterceptor.class);
        
        @Autowired
        private RedisTemplate<String, String> redisTemplate;
    
        
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                Object handler) throws Exception {
                //业务逻辑
             return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                Object handler, Exception ex) throws Exception {
            
        }
    }

    查询原因

    拦截器执行在Bean初始化之前导致这个问题的。在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->filter-->servlet; 而拦截器是在Spring MVC中配置的,如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param-->listener-->filter-->servlet-->interceptor,为什么拦截器是在servlet执行之后,因为拦截器本身就是在servlet内部的。

    概念

    • servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
    • filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
    • listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据 其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执 行代码的功能组件。
    • interceptor:拦截器是对过滤器更加细化的应用,他不仅可以应用在service方法前后还可以应用到其他方法的前后拦截器。
  • 相关阅读:
    Sharepoint2013:日期控件报错
    Sharepoint2013:在页面上显示错误信息
    BeforeProperties/AfterProperties in Event Receivers
    一个ORM的实现(附源代码)
    DBHelper (支持事务与数据库变更)
    TypeError: <flask_script.commands.Command object at 0x00000201F36629E8>: option values must be strings
    Flask启动时报错:ValueError: urls must start with a leading slash
    {TypeError}__init__() takes from 1 to 2 positional arguments but 3 were given
    pycharm2019激活方法(有效期到2100年1月1日)
    Warning | 3719 | 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
  • 原文地址:https://www.cnblogs.com/lywJ/p/11077023.html
Copyright © 2011-2022 走看看