返回顶部
首页 > 资讯 > 精选 >FeignClient怎么共享Header及踩坑过程
  • 128
分享到

FeignClient怎么共享Header及踩坑过程

2023-06-29 09:06:57 128人浏览 八月长安
摘要

本篇内容主要讲解“FeignClient怎么共享Header及踩坑过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FeignClient怎么共享Header及踩坑过程”吧!FeignClien

本篇内容主要讲解“FeignClient怎么共享Header及踩坑过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FeignClient怎么共享Header及踩坑过程”吧!

FeignClient共享Header及踩坑

问题

我们在调用feign的情况下,经常需要用到客户端所持有的header比如说auth-token,我们需要将这些header传递下去

思路

使用拦截器,在客户端拦截feign的请求,并把所需要的header传递下去

代码:

定义拦截器

@Configurationpublic class FeignInterceptor implements RequestInterceptor {    @Override    public void apply(RequestTemplate requestTemplate) {        Map<String,String> headers = getHeaders(gethttpservletRequest());        for(String headerName : headers.keySet()){            requestTemplate.header(headerName, getHeaders(getHttpServletRequest()).get(headerName));        }    }    private HttpServletRequest getHttpServletRequest() {        try {            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    private Map<String, String> getHeaders(HttpServletRequest request) {        Map<String, String> map = new LinkedHashMap<>();        Enumeration<String> enumeration = request.getHeaderNames();        while (enumeration.hasMoreElements()) {            String key = enumeration.nextElement();            if(needThisHeader(key)){               String value = request.getHeader(key);               map.put(key, value);            }        }        return map;    }  private boolean needThisHeader(String headerName){     //todo:这里写你的逻辑,哪些header需要传递,千万不能把所有的header传下去      return true;  }}

将拦截器注入到spring

@Configurationpublic class FeignSupportConfig {        @Bean    public RequestInterceptor requestInterceptor(){        return new FeignInterceptor();    }}

说说坑吧

一定不能把所有的header都往下传,这样很可能会导致在调用feign的时候,请求类型混乱,应该需要哪些header就穿哪些header

Feign设置Header头部

今天尝试用feign去调用其他部门提供的一个HTTP接口,该接口要求在请求中设置一个username头部,用于身份鉴权。

@FeignClient(name = "kafka-client", url = "http://kafka.xxx.com")public interface KafkaClient {    @GetMapping(value = "/api/clusterManager/listTopics")    @Headers( {"cache-control: no-cache", "username: wangyong@xxx.com"})    TopicsResponse listTopics(@RequestParam("clusterName") String clusterName,                              @RequestParam("clusterArea") String clusterArea);}

代码写好好,尝试去进行访问

抛出如下错误信息

{    "timestamp": 1551768926170,    "status": 500,    "error": "Internal Server Error",    "exception": "com.netflix.zuul.exception.ZuulException",    "message": "pre:AuthAccessFilter"}

异常堆栈信息如下:

    at feign.FeignException.errorStatus(FeignException.java:62)
    at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:134)
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
    at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
    at com.sun.proxy.$Proxy147.listTopics(Unknown Source)
    at com.yidian.data.exptmgr.controller.KafkaController.getKafkaTopics(KafkaController.java:35)
    // 省略更多异常堆栈信息

于是我尝试通过debug来找到问题的根源,通过debug我发现feign会先将请求参数构建成Request对象,request信息如下:

FeignClient怎么共享Header及踩坑过程

request

从图中可看到,该Request实例的headers属性为空,而Request又是根据RequestTemplate模板对象生成的,RequestTemplate实例信息如下:

FeignClient怎么共享Header及踩坑过程

RequestTemplate

到这里可以看出,问题是出在RequestTemplate的构建构成中,于是我就去跟踪RequestTemplate构建的代码,发现RequestTemplate是根据MethodMetadata构建而成,而MethodMetadata就是对方法配置的抽象。

    RequestTemplate template = resolve(argv, mutable, varBuilder);      if (metadata.queryMapIndex() != null) {        // add query map parameters after initial resolve so that they take        // precedence over any predefined values        template = addQueryMapQueryParameters(argv, template);      }      if (metadata.headerMapIndex() != null) {        template = addHeaderMapHeaders(argv, template);      }

从上述代码可以看到,header的设置是由metadata的headerMapIndex 属性决定的,那么,设置headerMapIndex的位置,必然就和Header的解析相关,于是通过查看方法引用

我找到了下面的代码

    private void parseHeaders(MethodMetadata md, Method method,            RequestMapping annotation) {        // TODO: only supports one header value per key        if (annotation.headers() != null && annotation.headers().length > 0) {            for (String header : annotation.headers()) {                int index = header.indexOf('=');                if (!header.contains("!=") && index >= 0) {                    md.template().header(resolve(header.substring(0, index)),                        resolve(header.substring(index + 1).trim()));                }            }        }    }

从代码中我们可以清晰的看到,解析过程中是从@RequestMapping或其派生注解的header属性中解析Header的,并且Header的key和value需要用“=”进行分割。

于是我修改成下面的形式,

问题就解决了

   @GetMapping(value = "/api/clusterManager/listTopics",        headers = {"cache-control=no-cache", "username=wangyong@xxx.com"})    TopicsResponse listTopics(@RequestParam("clusterName") String clusterName,                              @RequestParam("clusterArea") String clusterArea);

到此,相信大家对“FeignClient怎么共享Header及踩坑过程”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: FeignClient怎么共享Header及踩坑过程

本文链接: https://lsjlt.com/news/324010.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • FeignClient怎么共享Header及踩坑过程
    本篇内容主要讲解“FeignClient怎么共享Header及踩坑过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FeignClient怎么共享Header及踩坑过程”吧!FeignClien...
    99+
    2023-06-29
  • FeignClient如何共享Header及踩坑过程记录
    目录FeignClient共享Header及踩坑问题思路定义拦截器将拦截器注入到Spring说说坑吧Feign设置Header头部抛出如下错误信息我找到了下面的代码问题就解决了Fei...
    99+
    2024-04-02
  • Docker 安装Jenkins全过程及踩坑指南
    目录Docker 安装 Jenkins1. 安装过程2. Jenkins 安装 npm2.1. 替换容器的源2.2. 安装nodejs和npm3. Jenkins流水线 + Dock...
    99+
    2024-04-02
  • k8s Kubernetes v1.10.0 集群安装以及踩坑过程
    本篇文章为大家展示了k8s Kubernetes v1.10.0 集群安装以及踩坑过程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。因工作需求,最近开始研究docker及k8s相关的资料,本文主要记...
    99+
    2023-06-19
  • 使用Nginx部署Vue项目全过程及踩坑记录
    目录Nginx部署Vue项目使用Nignx部署Vue项目步骤1.打包Vue项目2.复制dist文件夹到Vue默认目录3.高级配置重新启动 Nginxlinux环境总结Nginx部署V...
    99+
    2023-02-15
    Nginx部署Vue项目 使用Nginx部署Vue Vue部署Nginx
  • 前端Vue项目部署到服务器的全过程以及踩坑记录
    目录需求过程1、首先,肯定需要将vue的项目进行打包2、将dist文件上传到服务器3、使用Nginx配置 踩坑nginx服务器404错误的原因 404  Not ...
    99+
    2023-05-19
    vue项目布置到服务器 vue项目如何部署 前端项目怎么部署到服务器上
  • win8怎么设置共享 win8共享网络设置教程
      网络和共享中心是Windows操作系统对网络配置和应用的最主要的图形化操作界面,windows8的网络和共享中心与Win7的网络和共享中心有较大的改变,删除了许多用户不常用的内容,使得用户操作更加简便快...
    99+
    2022-06-04
    教程 网络
  • 微信小程序怎么实现数据共享与方法共享
    微信小程序怎么实现数据共享与方法共享,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。全局数据共享 Mobox原生小程序开发中我们可以通过 mobx-miniprogram 配...
    99+
    2023-06-26
  • c语言多线程怎么共享
    c 语言多线程共享数据的方式包括:共享全局变量(存在线程安全和可伸缩性问题)共享指针(灵活,但存在线程安全问题)共享互斥量(保障线程安全,但引入开销)共享信号量(限制资源访问次数)共享条...
    99+
    2024-05-21
    c语言 同步机制
  • win7一键共享工具怎么用 win7共享一键设置教程
    很多人不会设置win7与xp之间的网络共享,我们可以借用win7共享工具已将搞定,win7一键共享工具怎么用?下面小编就为大家带来win7共享一键设置教程,希望能为大家解决问题。 win7一键共享工具怎么用 win7共享...
    99+
    2023-06-12
    win7 一键共享 工具 教程 共享
  • win7共享怎么设置?win7系统设置局域网共享教程
    想要开启Windows7系统的网络共享如何操作?win7共享怎么设置?下面小编就 win7共享怎么设置?win7系统设置局域网共享教程 1. 把win7的guest用户开启。打开win7的控制面板=》用户账号与安全=》...
    99+
    2023-06-12
    win7 局域网 共享 系统 ?win7 教程
  • 记录一次一路踩坑的Android Studio平台c++项目配置及编译过程
    //TODO:点太多,简要记录,有时间在整理(NEVERDO) 使用cmake jni资料:https://www.jianshu.com/p/87ce6f565d37 坑总结...
    99+
    2022-06-06
    Android Studio c+ studio C++ Android
  • WebLogic中怎么通过数据库配置Session共享
    这篇文章将为大家详细讲解有关WebLogic中怎么通过数据库配置Session共享,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。    ...
    99+
    2024-04-02
  • Go通道channel怎么通过通信共享内存
    本文小编为大家详细介绍“Go通道channel怎么通过通信共享内存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go通道channel怎么通过通信共享内存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。引言不要通...
    99+
    2023-07-02
  • 怎么在c#中通过内存映射共享文件
    本篇文章给大家分享的是有关怎么在c#中通过内存映射共享文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。App1代码:using System;using ...
    99+
    2023-06-14
  • android跨进程共享数据怎么实现
    Android中跨进程共享数据可以使用以下方法实现:1. 使用Binder机制:Binder是Android中一种轻量级的进程间通信...
    99+
    2023-10-10
    android
  • golang多线程共享变量怎么实现
    在Go语言中,可以使用`sync`包中的`Mutex`或`RWMutex`来实现多线程之间共享变量的访问控制。 `Mutex`是一种...
    99+
    2023-10-25
    golang
  • 多台电脑怎么共享文件教程
    这篇文章主要讲解了“多台电脑怎么共享文件教程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“多台电脑怎么共享文件教程”吧!多台电脑共享文件的方法:首先需要将共享的电脑连接进入同一个“局域网”。...
    99+
    2023-07-02
  • python多线程数据共享怎么实现
    在Python中,可以使用`threading`模块来实现多线程数据共享。具体步骤如下: 导入`threading`模块:`im...
    99+
    2023-10-26
    python
  • 手机怎么远程云服务器共享
    如果您的手机是智能手机,那么通过远程云服务器共享您的电脑是一个非常方便的功能。您的电脑可以作为云服务器的节点运行,而无需使用自己的计算设备(如电脑)。 远程云服务器共享功能通常是由云服务提供商提供的。您可以访问这些云服务提供商提供的服务...
    99+
    2023-10-27
    服务器 手机
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作