RedisTemplate为null的问题

最近在搭建一个项目,然后项目框架采用的是spring boot,然后登录我就使用新学习的JWT嘛,然后就想着在请求进来的时候使用拦截器先对传进来的token进行校验,然后惊奇的发现,一致报错token无效,我写单元测试token也没有问题,然后就是缓存一直没有查询到当前的令牌。

先来看看我是怎么写的

 @Autowired
private RedisTemplate redisTemplate; /**
* 请求处理
*
* @author zhanglianyong
* @date 2022/9/6
* @param request 请求
* @param response 响应
* @param handler 处理器
* @return 是否允许通过
**/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception { //获取请求头中的令牌
String token = request.getHeader("Authorization");
log.info("Authorization:{}", token);
// 先从缓存中查询看看有没有当前令牌
try {
JwtUtils.verify(token);
// 先查询token在缓存中有没有存在
Object user = redisTemplate.opsForValue().get(token);
if (null != user) {
return true;
}
throw CommonException.fail("缓存中没有查询到当前token");
} catch (SignatureVerificationException e) {
throw JwtException.signatureVerificationException();
} catch (TokenExpiredException e) {
throw JwtException.tokenExpiredException();
} catch (AlgorithmMismatchException e) {
throw JwtException.algorithmMismatchException();
} catch (InvalidClaimException e) {
throw JwtException.invalidClaimException();
} catch (CommonException e) {
throw CommonException.userFail(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
log.info("报错信息:{}", e.getMessage());
throw CommonException.fail("token无效");
}
}

然后这样看似乎是没有什么问题的,但是不断发现报错去debug后,发现redisTemplate是null,相当于这个RedisTemplate没有注入,这里确实我没有写好,如果严谨点的话,要是判断,然后抛出异常也知道是什么原因了,但是我没有,然后我就不断不断的试,在纳闷…

解决方案

我去查了一下,然后是因为拦截器是在Bean实例化就已经执行了,所以就会出现上述这种情况,解决方法也很简单,就是在加载拦截器时我们先实例化这个拦截器,将这个Bean注入进去,我们用一个实例工厂,在添加拦截器时将这个Bean注入进去。

@Bean
public JwtInterceptor getJwtInterceptor() {
return new JwtInterceptor();
} @Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getJwtInterceptor())
.addPathPatterns("/user/**")
.excludePathPatterns("/doc.html")
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/user/login");
}

最后

通过上面这样就可以解决加载不进去的问题了,这时运行的redisTemplate就是已经加载进去的了

RedisTemplate在拦截器前没有注入的问题的更多相关文章

  1. 解决 Springboot中Interceptor拦截器中依赖注入失败

    问题: 在Springboot拦截器Interceptor中使用@Resource依赖注入时,发现运行的时候被注解的对象居然是null,没被注入进去 原配置为: @Configurationpubli ...

  2. SpringMVC利用拦截器防止SQL注入

    引言 随着互联网的发展,人们在享受互联网带来的便捷的服务的时候,也面临着个人的隐私泄漏的问题.小到一个拥有用户系统的小型论坛,大到各个大型的银行机构,互联网安全问题都显得格外重要.而这些网站的背后,则 ...

  3. SpringBoot拦截器中无法注入bean的解决方法

    SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...

  4. Struts2使用自定义拦截器导致Action注入参数丢失、url参数

    写struts2项目时发现前台超链接中的参数无法传到action, 所有带有传递参数的均无法正常使用了,在Action中所有的参数无法被注入. 后来经过debug发现其中的页面都要先经过拦截器,而后再 ...

  5. 【SpringBoot】拦截器使用@Autowired注入接口为null解决方法

    最近使用SpringBoot的自定义拦截器,在拦截器中注入了一个DAO,准备下面作相应操作,拦截器代码: public class TokenInterceptor implements Handle ...

  6. Spring MVC通过拦截器处理sql注入、跨站XSS攻击风险

    sql注入就是通过url或者post提交数据时候,字符串类型的参数会被别人利用传入sql语句,最终破坏数据库或者达到一些见不得人的目的. 有时候因为业务需要url中会带一些参数,比如 ?type=xx ...

  7. SpringBoot拦截器中Bean无法注入(转)

    问题 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Be ...

  8. [Abp vNext 源码分析] - 3. 依赖注入与拦截器

    一.简要说明 ABP vNext 框架在使用依赖注入服务的时候,是直接使用的微软提供的 Microsoft.Extensions.DependencyInjection 包.这里与原来的 ABP 框架 ...

  9. 【tmos】如何在Interceptor拦截器中注入其他数据

    光是这样是获取不到weixinConfig内容的 public class WebLoginInterceptor implements HandlerInterceptor { @Autowired ...

  10. springboot拦截器注入service为空

    一般都是因为除了在拦截器之外,还需要在拦截器的配置类中,注册拦截器时没有使用spring的bean,而是使用了new创建bean造成的. @Configuration public class Web ...

随机推荐

  1. Flush cache via menu in D365FO

    Most of the time it is a caching issue because D365fO is (like previous versions) a master of cachin ...

  2. python tkinter Checkbutton的新增和清除 取值

    from tkinter import * root = Tk() name = StringVar() check_box_list = [] ent=Entry(root,textvariable ...

  3. IDEA学生认证的步骤详解

    步骤详解 在上次使用学生认证的方法对jetbrains认证成功之后,咱们在IDEA这里认证一下吧! 一.点击help这里的register 如图所示: 进入这样一个界面: 然后点击左下角的的Log I ...

  4. 【打怪升级】【rocketMq】rocket的持久化

    rocket持久化保证的思想有两点:1是刷盘保证大部分数据不丢失:2是持久化文件的处理,零拷贝技术和内存页,NIO模型保证处理能力 文件持久化目录 ├──abort:rocket broker启动检查 ...

  5. SpringBoot工程入门case

    SpringBoot的设计目的是用来简化Spring应用的初始搭建以及开发过程. SpringBoot入门案例: 1.创建一个新module 2.除pom和src文件剩余都删除. 3.在src.com ...

  6. Module not found: Error: Can't resolve 'pubsub-js'

    包未安装或者包版本过新,再者安装位置有误. 我安装各种工具库或者其他包时有个 -g 到全局的习惯,觉得装到全局时在文件夹中何时何处都可以用. 在子孙文件夹中引入时依赖会在子孙和文件根目录的node_m ...

  7. selenium验证码处理-打码平台操作

    1.进入打码平台(超人,斐斐) 斐斐-------官网: 超人-------官网: 2.选择对应的开发文档,下载对应的demo示例,并把demo的python脚本放到项目包管理地址去 参考: 超人的开 ...

  8. 一个.Net简单、易用的配置文件操作库

    在我们日常项目开发中,操作INI/CFG配置文件,往往会通过调用WinAPI来实现,WinAPI接口参数只支持字符串,而我们项目中,往往数据类型是多种多样的,在保存和获取配置值,我们就要进行类型的转换 ...

  9. 运输问题—R实现

    table { margin: auto } 运输问题 随着社会和经济的不断进步,现代物流业蓬勃发展,如何充分利用时间.信息.仓储.配送和联运体系创造更多的价值,是物流运作必须解决的问题.运输问题(t ...

  10. ServiceAccounts 及 Secrets 重大变化

    关于 ServiceAccounts 及其 Secrets 的重大变化 kubernetes v1.24.0 更新之后进行创建 ServiceAccount 不会自动生成 Secret 需要对其手动创 ...