一、问题描述
场景是当时处理一个每天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