当前位置: 首页 > news >正文

微服务间 Feign 调用传递 Token 丢失导致 401 未授权怎么解决?

最推荐的做法是在客户端配置一个实现了 RequestInterceptor 接口的 Bean,手动将当前请求头中的 Token 复制到 Feign 的请求模板中。

先说结论:这是 Spring Cloud OpenFeign 的默认设计,需要显式配置拦截器来透传 Header。

  • 先确认:检查下游服务是否依赖 Header 中的 Authorization 字段进行鉴权。
  • 先处理:编写 RequestInterceptor 实现类,从 RequestContextHolder 获取请求头并设置到 RequestTemplate。
  • 再验证:通过链路追踪或下游日志确认 Token 是否已成功送达。

快速处理思路

这个问题通常不需要修改业务逻辑,而是集中在网关或调用方的配置层。核心思路是拦截 Feign 构建请求的过程,把当前线程绑定的 HttpServletRequest 里的 Header 复制过去。如果项目使用了 Spring Security,还要注意 SecurityContext 的传递问题,但大多数 401 问题仅通过复制 Header 即可解决。

为什么会这样

Feign 是一个声明式的 Web 服务客户端,它底层发起的是全新的 HTTP 请求。Spring Cloud OpenFeign 默认不会自动把上游请求(比如来自网关或浏览器的请求)的 Header 透传到下游服务。这样设计主要是为了安全和解耦,避免敏感信息意外泄露,同时也防止下游服务依赖上游的特定 Header 结构。

当用户请求到达服务 A 时,Token 通常存放在 HttpServletRequest 的 Header 中。服务 A 调用服务 B 时,Feign 会创建一个新的 RequestTemplate,如果不手动干预,这个模板里就不会包含原来的 Authorization 字段,导致服务 B 的鉴权过滤器拦截并返回 401。

分步处理

以下方案基于 Spring Cloud OpenFeign 标准实现,适用于大多数 Spring Boot 2.x 和 3.x 版本。

1. 创建拦截器类

新建一个类实现 RequestInterceptor 接口,重点是从 RequestContextHolder 中获取当前请求属性。

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
// Spring Boot 2.x 使用 javax.servlet.http.HttpServletRequest
// Spring Boot 3.x 使用 jakarta.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletRequest;@Component
public class FeignTokenInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();if (requestAttributes instanceof ServletRequestAttributes) {HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();String token = request.getHeader("Authorization");if (token != null && !token.isEmpty()) {template.header("Authorization", token);}}}
}

2. 注册为 Bean

确保该类被 Spring 容器管理,通常加上 @Component 注解即可。如果项目中有多个 Feign 客户端,确认该拦截器是否全局生效,或者通过 @FeignClient(configuration = ...) 指定特定配置。

3. 注意线程上下文

如果调用发生在异步线程中,RequestContextHolder 可能为空。主线程请求通常没问题,但如果使用了 @Async 或线程池,需要手动传递上下文或使用 InheritableThreadLocal 配置。

怎么验证是否生效

1. 查看下游日志

在服务 B 的控制器或鉴权过滤器中打印接收到的 Header 信息。确认 Authorization 字段是否存在且值正确。

2. 使用链路追踪

如果项目集成了 SkyWalking 或 Zipkin,查看调用链详情。部分追踪插件会自动记录 Header 信息,确认请求跨度中是否包含 Token。

3. 临时断点调试

FeignTokenInterceptorapply 方法中打断点,观察 template.headers() 在方法执行后是否包含了 Authorization 键值对。

常见坑

1. 安全风险

不要无条件透传所有 Header。某些内部 Header 或敏感信息不应传递到下游,建议只白名单复制 AuthorizationX-User-Id 等必要字段。

2. 循环依赖

如果服务 A 调服务 B,服务 B 又调服务 A,且都透传 Token,可能导致鉴权逻辑循环或栈溢出。确保微服务调用链路清晰。

3. 异步线程丢失

异步线程默认不继承 RequestContextHolder 上下文,这是 ThreadLocal 机制决定的。如果遇到间歇性 401,重点排查异步调用场景,建议使用 Alibaba TransmittableThreadLocal 或配置 Spring 线程池继承上下文。

4. Header 名称大小写

HTTP Header 名称通常不区分大小写,但某些鉴权组件可能严格匹配。建议统一使用标准写法 Authorization

参考来源

  • Spring Cloud OpenFeign Reference Documentation, "Customizing Feign Clients" (https://spring.io/projects/spring-cloud-openfeign)
  • Spring Framework Documentation, "RequestContextHolder" (https://spring.io/projects/spring-framework)

原文链接:https://www.zjcp.cc/ask/11371.html

http://www.jsqmd.com/news/835521/

相关文章:

  • 2026 iOS/安卓手机免费去水印App推荐|一键去除视频图片水印的软件测评 - 科技热点发布
  • 抖音视频怎样在线去水印?2026实测解析去水印操作方法与平台推荐 - 科技热点发布
  • 钢格板厂家常见问题解答(2026最新专家版) - 速递信息
  • 砌块工厂选购指南:如何选到靠谱的砌块生产供应商? - 速递信息
  • 佛山大学 2024—2025届就业优势深度全景报告:湾区智造高地、就业质量标杆 - 寻茫精选
  • 豆包视频怎么去水印?2026 去掉水印保存无水印视频的方法大全 - 科技热点发布
  • 提前3天交付!钢格板厂家电厂项目案例解析 - 速递信息
  • 金华:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 小红书怎么关闭下载水印?2026年最新关闭下载水印方法盘点 - 科技热点发布
  • 2026年工程采购必读:靠谱钢格板厂家怎么选?恺嵘丝网给出国标品质方案 - 速递信息
  • 中大型企业 GEO 全域布局决策白皮书:聚焦核心发展维度,搭建精准高效全域布局体系 - 速递信息
  • 快手视频怎样去水印?2026 快手去水印在线工具与视频解析提取方法实测 - 科技热点发布
  • 2026抖音视频怎么在线去水印?五款去水印平台实测对比,附操作方法 - 科技热点发布
  • 《动手学强化学习》学习记录
  • 2024 CCPC 邮寄
  • 在职备考法考推荐哪个APP?揽星法考APP精准适配,助在职考生高效通关 - 速递信息
  • 36.贵阳报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 小红书怎么关闭下载水印?2026最新方法vs工具对比,一文搞定小红书关闭下载水印难题 - 科技热点发布
  • 2026年手机免费一键去水印App排行盘点:3秒出结果,选对工具一步到位 - 科技热点发布
  • Linux系统之时间同步与日志管理练习 - kevin
  • 厦门母婴除甲醛CMA甲醛检测治理公司多少钱怎么收费 - 张诗林资源库
  • 【亲测门店】绍兴嵊州随车吊租赁,实践分享哪家强。并附带联系方式 - 花开富贵112
  • 太原:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 小红书怎么关闭下载水印?如何去掉小红书视频水印?2026最新方法实测 - 科技热点发布
  • 上海公司搬迁避坑全攻略|亲历大型企业搬迁,高效稳妥不踩雷 - 速递信息
  • 厦门母婴除甲醛CMA甲醛检测治理公司哪家好权威机构 - 张诗林资源库
  • 抖音视频怎样在线去水印?2026 抖音在线解析去水印方法和平台推荐 - 科技热点发布
  • 常州:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 烟台:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 2026年视频号视频怎么下载到手机相册?一文汇总最新下载方法与实用工具 - 科技热点发布