SpringBoot拦截器中使用RedisTemplate

这几天想着把登陆拦截器的验证规则修改一下,验证介质由session中获取改为从redis中获取,结果发现redisTemplate一直为空,

java 复制代码
@Configuration
public class WebInterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //这种方式会拦截所有请求
        registry.addInterceptor(new MyInterceptor());
        //这种方式会拦截指定的请求
//        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/helloInterceptor");
    }
}

上面是修改之前的拦截器代码,很简单,下面是拦截器部分的代码

java 复制代码
public class MyInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, Object handler) throws Exception {
      //自定义拦截规则
    }
  
  }

可以看到这里使用了ioc自动注入的方式来获取我们预定义好的RedisTemplate对象,但是在调试的过程中失败了,发生了NPE

仔细一想,拦截器在SpringContext初始化之前就执行了,Bean初始化之前它就执行了,所以它肯定是无法获取SpringIOC容器中的内容的。那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取就能解决这个问题啦。

下面是修改过后的代码:

javascript 复制代码
public class WebInterceptorConfig implements WebMvcConfigurer {

    @Bean
    public MyInterceptor getLoginHandlerInterceptor(){
        return new MyInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //这种方式会拦截所有请求
        registry.addInterceptor(getLoginHandlerInterceptor());
    }
}

项目启动,完美解决!

相关推荐
杨杨杨大侠44 分钟前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
凤山老林1 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
Thinker QAQ2 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
朱涛的自习室2 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
霸道流氓气质3 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路3 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
woniu_maggie5 小时前
SAP MDG主数据治理实战:从架构原理到项目实施全解析
后端
xiaoqiMikko5 小时前
Redis 实战(一):内存满了 —— 拒写、淘汰、被系统杀掉,以及删了 key 内存为什么不降(6.2.4 实测)
redis·后端
dishugj5 小时前
系统架构风险点、敏感点和权衡点的概念和区分
java·开发语言