ETJava Beta | Java    注册   登录
  • Springboot配置Interceptor时RedisTemplate为null处理

    发表于 2025-02-03 21:29:48     阅读(66)     博客类别:Springboot

    Springboot配置Interceptor时RedisTemplate为null处理

    问题说明

    在使用Springboot配置拦截器时 由于拦截器执行的顺序在SpringContext之前 即 Bean实例化之前,因此在拦截器中注入的Bean自然为null,如果我们想让某些操作在拦截器中执行 例如 记录日志 那么就要让拦截器执行的时候实例化Bean 然后在注入Bean就可以正常使用了

     

    解决方案

    1. 定义一个全局的配置类

    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
       
    
        // 拦截器执行之前实例化对应的Bean
        @Bean
        public LoginHandleInterceptor getSessionInterceptor() {
            return new LoginHandleInterceptor();
        }
    
        // 配置拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(getSessionInterceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns("/login");
        }
    }
    

    2. 拦截器中注入Bean

    @Component
    public class LoginHandleInterceptor implements HandlerInterceptor {
        @Resource// 或是使用@Autowired均可
        private RedisTemplate<String,Object> redisTemplate;
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            //获取header中的参数
            String token = request.getHeader("token")==null? "":request.getHeader("token");
    
            //查询token在redis中的剩余时间
            Long expire = redisTemplate.getExpire(token);
    
            if(expire>0){//登入状态
                //重新设置缓存时间
                redisTemplate.expire(token,30L, TimeUnit.MINUTES);
                //已登入,放行
               return true;
            }else{
                //未登入,相应数据
                return false;
            }
        }
    }