当前位置:网站首页>记录定时任务中调用feign接口认证不通过的一次bug
记录定时任务中调用feign接口认证不通过的一次bug
2022-07-17 00:02:00 【雨~旋律】
一、问题描述
场景是当时处理一个每天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也可看到:
那么我们公司也有对应的解决办法,在gateway自制了一个跳过权限验证的过滤器keyPair,然后只需在gateway中配置需要跳过权限验证的路径即可,指定过滤器为刚才提到的keyPair.
当然呢,通过搜索别的帖子,解决办法也有不同的,不过原因都是因为上面的原因,在这里分享一个别人解决的方法:总结一下就是既然token为Null,就直接让它带着默认token即可。
@Configuration
public class FeignConfiguration implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
if (attributes == null) {
**RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest()));//为空进行新建**
}
HttpServletRequest request = attributes.getRequest();
// 对消息头进行配置
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
/** * 判断有没有token,如果是定时任务进来,是没有token的,此时用默认token以调用到对应的Feign服务 */
boolean flag = true;
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
if(name.equals("token")){
flag = false;
}
template.header(name, values);
}
if(flag){
template.header("token","[email protected]#$%^&*()Cid6032001_Feign");
}
}
// 对请求体进行配置
Enumeration<String> bodyNames = request.getParameterNames();
StringBuffer body =new StringBuffer();
if (bodyNames != null) {
while (bodyNames.hasMoreElements()) {
String name = bodyNames.nextElement();
String values = request.getParameter(name);
body.append(name).append("=").append(values).append("&");
}
}
if(body.length()!=0) {
body.deleteCharAt(body.length()-1);
template.body(body.toString());
}
}
}
三、参考资料
边栏推荐
猜你喜欢

Matlab画心

关于自定义监听器 onApplicationEvent方法被执行多次的问题

PHP上传图片

J9数字论:去中心化身份的主流化还有多久?

See the application of comparative learning in recommendation from 22 top meetings

Advanced Mathematics - Chapter 8 differential calculus of multivariate functions - extreme and maximum values of multivariate functions

从22顶会看对比学习在推荐的应用

flutter 项目 ScrollController attached to multiple scroll views,Failed assertion: line 109 pos 12 报错处理

必备基础:加签验签

Photoshop网页设计教程
随机推荐
The logical architecture of MySQL
Perspective rendering
【单例模式】饿汉式、懒汉式、双重锁安全验证
flutter 项目 ScrollController attached to multiple scroll views,Failed assertion: line 109 pos 12 报错处理
Uva11362 phone list solution
[gradle] quick configuration
利用 Redis 的 sorted set 做每周热评的功能
[Shader implémente l'effet Wave Shader chapitre 1]
ROS 通信机制进阶
Computer Graphics From Scratch - Chapter 3
队列的链式表示和实现
如何设计一个安全的对外接口
See the application of comparative learning in recommendation from 22 top meetings
Oracle 数据库架构
flutter项目中 advance_image_picker 组件使用
[singleton mode] hungry, lazy, double lock security verification
[deep learning] (II) basic learning notes of deep learning
@postconstruct注解 和 InitializingBean 在bean实例化后执行某些初始化操作
网关Kong路由添加说明
并查集