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

在设置feign请求的请求头透传(Header Propagation)时获取不到当前服务请求头的信息

问题:希望在每次feign请求的时候在请求头中设置请求本服务的请求头信息,也就是将请求头信息带到feign请求中,也就是请求头透传(Header Propagation),但是发现在配置中获取不到请求的信息,代码:

package com.winkeytech.config;import com.alibaba.nacos.common.utils.StringUtils;
import com.winkeytech.properties.FeignProperties;
import feign.RequestInterceptor;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;@Data
@Configuration
public class FeignHeaderConfig {private final FeignProperties feignProperties;@Beanpublic RequestInterceptor headerRequestInterceptor() {return requestTemplate -> {// 1. 先调用父类(Blade 默认逻辑,传递认证信息)// 如果你不继承 BladeFeignRequestInterceptor,可以跳过// super.apply(requestTemplate);// 2. 获取当前请求的 HttpServletRequestServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (attributes == null) {// 非 Web 请求上下文(如定时任务),跳过透传return;}HttpServletRequest request = attributes.getRequest();// 3. 定义要透传的 Header 白名单(安全!不要透传所有 Header)Set<String> headersToPass = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("Tenant-Id","Authorization","X-Request-Id","X-User-Id","X-User-Name")));for (String headerName : headersToPass) {String value = request.getHeader(headerName);if (StringUtils.isNotBlank(value)) {requestTemplate.header(headerName, value);}}};}}

获取到的attributes变量为null,获取不到请求头中的信息

原因:因为使用Hystrix

解决:需要添加额外的配置类(如果是异步调用也要)

package com.winkeytech.config;import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;import java.util.concurrent.Callable;@Configuration
public class HystrixConfig {@Beanpublic HystrixConcurrencyStrategy hystrixConcurrencyStrategy() {return new HystrixConcurrencyStrategy() {@Overridepublic <T> Callable<T> wrapCallable(Callable<T> callable) {// 传播RequestContext到Hystrix线程RequestAttributes context = RequestContextHolder.currentRequestAttributes();return () -> {try {RequestContextHolder.setRequestAttributes(context);return callable.call();} finally {RequestContextHolder.resetRequestAttributes();}};}};}
}

http://www.dtcms.com/a/495585.html

相关文章:

  • 服装网站设计网站强制分享链接怎么做的
  • DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(二)
  • WPF中的变换(Transform)功能详解
  • 北京做网站主机开通成功网站建设中
  • 工业显示器在微铣削机床中的应用
  • 合肥手机网站建设陕西网站建设平台
  • 东莞网站推广及优化平台营销策略
  • exp4j并发解决
  • 学习博弈本身过程脑是怎么看的?
  • 风险感知中枢:监测预警系统的架构与核心
  • 使用ROS2 + Qt编写一个简易计算器
  • 校园资料分享平台|基于SpringBoot和Vue的校园资料分享平台(源码+数据库+文档)
  • 企业花钱做的网站出现违禁词本地wordpress 手机浏览器
  • 网站建设最基础是什么广东网站建设服务商
  • 如何模仿一个网站云手机免费版无限挂机
  • Vue2 + Office Add-in关于用vue项目于加载项控制excel单元格内容(Demo版)
  • TS在Vue3中的使用实例集合
  • 储能技术适配绿电直连场景深度对比
  • React + Ant Design 日期选择器避免显示“Invalid Date“的解决方案
  • Vue 3 多实例 + 缓存复用:理念及实践
  • 手机网站自适应布局怎么做wordpress背景图片下载
  • Java基础——面向对象进阶复习知识点3
  • wordpress资讯站模板网站建设 智能建站
  • NoSQL介绍
  • 【实时Linux实战系列】FPGA 与实时 Linux 的协同设计
  • 可以做翻译兼职的网站wordpress icp链接
  • 【系统分析师】高分论文:数据库集群技术及应用
  • 西安知名高端网站建设服务企业郑州做系统集成的公司网站
  • 基于Matlab实现双目图计算深度图
  • sysctl -w net.ipv4.ip_forward=1 是一个Linux系统命令,用于开启IP转发功能