Shiro+jwt 在拦截器注入 报空指针异常

Field injection is not recommended

**Servlet.service() for servlet [dispatcherServlet] in context with path [] th
Field injection is not recommended**
  1. 最近在做一个整合shiro+jwt的项目,在做到拦截器实现myRealm自动登录
  2. 继承AuthenticatingFilter,重写onAccessDenied方法
  3. 本来打算就是在拦截器进行token的验证有效性,但是我拿的这个token验证有效性是封装好的,看下面
    // Token过期时间30分钟(用户登录过期时间是此时间的两倍,以token在reids缓存时间为准)
    public static final long EXPIRE_TIME = 30 * 60 * 1000;
    /**
     * 校验token是否正确
     *
     * @param token  密钥
     * @param secret 用户的密码
     * @return 是否正确
     */
    public static boolean verify(String token, String username, String secret) {
        try {
            // 根据密码生成JWT效验器
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
            // 效验TOKEN
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (Exception exception) {
            return false;
        }
    }

我一直以为的是我@Autowired注入有问题,因为上面有idea的提示说不建议这样使用,重名就会出问题,在开始我是带着这个问题去找答案,建议的是用@Resource,我后面改成@Resource还是这个问题
在这里插入图片描述在这里插入图片描述
事实证明在springboot4.0以后,都建议的使用@Resource
@Autowired:根据类型去找,如果有多个实现了,就会发生冲突,抛出异常
@Resource:是根据bean的名称去寻找,找不到再去匹配类型

后面在跑的时候,也还是出现这个问题,我就带着问题百度看大佬们的回答

结果如下:
在这里插入图片描述我认为的是第二条是对于我的这个问题的方向是正确的,然后我接着去查他们的执行顺序

context-param–>listener–>filter–>servlet–>interceptor(拦截器)

所以无论怎么样,初始化都得到的值就是null,所以就得通过WebApplicationContext去获取我们的服务类,如图:

            /**
             * 因为spring加载bean在拦截器之后,所以在这里注入是无法获得,会报空指针异常
             * 所以需要用WebApplicationContext来获取service类对象
             */
            WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
            UserService bean = wac.getBean(UserService.class);
            System.out.println("从WebApplicationContext里去获取的service"+bean);

走到这里了,就能够在拦截器的时候去获取我们需要的对象。

后续就能够成功的在拦截器调用我们的服务层去进行测试啦

参考链接:https://www.it610.com/article/1297505587197714432.htm

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值