You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Feign Client配置RequestInterceptor后调用资源服务返回403问题排查

问题原因&解决方案

1. 核心错误:请求头设置方法调用错误

Feign的RequestTemplate.header()方法的入参规则为:第一个参数是请求头名称,第二个参数是请求头值。你当前的写法将Authorization: Bearer ${token}整体作为请求头名称传入,没有设置对应值,最终请求中不会存在符合规范的Authorization头,是导致403的直接原因。

错误写法:

requestTemplate.header("Authorization: Bearer " + this.jwt);

修正后的写法:

requestTemplate.header("Authorization", "Bearer " + this.jwt);

2. 次要问题:Bean重复实例化风险

你已经给FeignC2aSystemOAuthInterceptor类添加了@Component注解,会被Spring全局扫描实例化,同时又在Feign专属配置类中再次通过@Bean声明该拦截器。如果Spring启动类的扫描范围包含该拦截器所在包,会导致拦截器被实例化两次,出现逻辑异常。
建议根据使用场景二选一:

  • 若该拦截器仅作用于当前c2aSystem对应的Feign客户端,去掉拦截器类上的@Component注解即可
  • 若该拦截器需要全局生效,删除Feign配置类中FeignC2aSystemOAuthInterceptor对应的@Bean声明

3. 潜在优化:并发场景线程安全问题

当前你将jwt、expirationDate作为类成员变量,多线程并发调用时如果刚好触发token刷新,可能出现脏读问题,建议刷新token逻辑加双重校验锁规避:

@Override
public void apply(RequestTemplate requestTemplate) {
    if (LocalDateTime.now().isAfter(expirationDate)) {
        synchronized (this) {
            // 二次校验,避免多线程排队等待后重复刷新token
            if (LocalDateTime.now().isAfter(expirationDate)) {
                requestToken();
            }
        }
    }
    requestTemplate.header("Authorization", "Bearer " + this.jwt);
}

内容的提问来源于stack exchange,提问作者valik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:24:02