记录定时任务中调用feign接口认证不通过的一次bug

一、问题描述

场景是当时处理一个每天0点定时检查xx有效期有没有小于一个月(同样通过相应feign接口去调用查询有效期),如果小于等于一个月,则调用相应的feign接口去重新申请。

 @Override
    public void execute(ShardingContext shardingContext) {
   
        try {
   
            logger.info("-------------------------开始查询xxx有效期-------------------------");
            Date endTime=XXClient.getEndTime();
            Date now =new Date();
            long day1 = (endTime.getTime() - now.getTime()) / 24 / 60 / 60 / 1000;
                  if(day1<=30) {
   
            //调用申请xx的方法
            XXClient.applyXX();
            logger.info("申请成功");
        }
        }catch (Exception e){
   
            logger.error(e.getMessage());
        }

    }

然后运行后报空指针:
在这里插入图片描述

二、定位问题

然后打日志发现,它只走了第一行的打印日志,第二行调用feign接口就已经报了该异常。
那么问题就很明显定位在feign接口这儿了,后面咨询同事才知道:
定时任务在项目启动的时候就会执行,导致request为空那么如果不去额外配置网关的话,肯定是会携带这个空的request,那么自然token也就为空,带着空的token去进行权限校验的,那么肯定就报出空指针。
别人的贴子debug也可看到:
在这里插入图片描述
其实同上面其他人帖子一样,我们公司对feign的配置也是如此,配置中加了对feign的拦截器其实简单来说分两步:
①从request中获取要调用的其他服务中token的值
②将这个token的值赋给该服务所用的认证请求头
那么问题就出现在获取request,原因和上面的图是一模一样的。
那么我们公司也有对应的解决办法,既然这个拦截器行不通,我自己写一个新的拦截器,不用request的token,我自己做一个自己的自签自验,所以我们公司先自己做了一个拦截器,往这个拦截器增加两个请求头,分别放一个uuid以及通过私钥加密后的uuid值,然后在gateway自制了一个权限验证的过滤器keyPair在这个keyPair对之前两个请求头进行校验完成自签自验,然后只需在gateway中配置需要跳过权限验证的路径即可,指定过滤器为刚才提到的keyPair.
该代码只是一个解决方案,是一个伪代码,已对代码做相关脱敏

@Configuration
public class FeignInterceptor implements RequestInterceptor {
   

    private static final Logger logger 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨~旋律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值