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
相关产品推荐
相关产品推荐

