bug记录(feign)——如何给feign加上请求头相关的参数,让生产者获得请求头中参数

news2024/11/18 11:29:22

在这里插入图片描述

问题描述

在微服务的调用中,如果消费者通过feign调用生产者,然后生产者方法中需要用到请求头,从请求头中获得token,但是feign默认是不携带请求头的,因此即使消费者请求feign的时候请求头中携带了token,也没有传到生产者,就会报相关的错误。

在这里插入图片描述

解决方案

1.如果token直接在请求头中

在这里插入图片描述

解决方案:加一个拦截器

在这里插入图片描述

package com.tianju.rabbit.feign.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
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;

@Configuration
@Slf4j
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 获取 HttpServletRequest
        ServletRequestAttributes attributes = (ServletRequestAttributes)
                RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        String token = request.getHeader("token");
        if (null!=token && !"".equals(token)){
            log.info(">>> feign拦截器获取token:{}",token);
            requestTemplate.header("token", token);
        }
    }
}

在这里插入图片描述

2.如果token在cookie里面

在这里插入图片描述
代码需要稍微做些修改

package com.tianju.rabbit.feign.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

@Configuration
@Slf4j
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 获取 HttpServletRequest
        ServletRequestAttributes attributes = (ServletRequestAttributes)
                RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        Cookie[] cookies = request.getCookies();
        for(Cookie cookie:cookies){
            if ("token".equals(cookie.getName())){
                // 把TOKEN带到下服务(token消息加到头消息)
                log.debug(">>>> feign的拦截器,获取token:"+cookie.getValue());
                requestTemplate.header("token",cookie.getValue());
            }
        }
    }
}

总结

给feign加一个拦截器,设置一下请求头。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QGIS003:【03捕捉工具栏】-点、线、面图层的捕捉操作

引言:QGIS捕捉工具栏包括启用捕捉、捕捉图层、捕捉位置、捕捉容差、启用拓扑编辑、拓扑规则、交叉处使用捕捉、启用追踪、自动捕捉等选项,本文介绍各选项的基本操作。 实验数据: 链接:https://pan.baidu.com/s/1GTeBNQqQJlJPj6Yu…

堆排序;大顶堆、小顶堆

堆排序 基本介绍 堆排序基本思想 堆排序步骤图解 在第二个步骤中,将节点6和它的两个左右节点比较大小,发现右节点最大,所以将节点6和节点9进行交换,如图所示,数组相应位置的值也交换 总结 代码实现 """…

Ubuntu 17.10的超震撼声音权限

从GNOME GUADEC 2017开发者大会归来之后,Canonical的Didier Roche就开始了一个日更博客系列,主要讲述即将带来的Ubuntu 17.10(Artful Aardvark)发行版将如何从Unity到GNOME Shell的转变。有趣的是,Ubuntu Unity桌面环境…

c语言练习91:合并两个有序链表

合并两个有序链表 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 代码1: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct Li…

基于springboot实现学生综合成绩测评系统项目【项目源码】

基于springboot实现学生合成绩测评系统演示 开发技术与环境配置 以Java语言为开发工具,利用了当前先进的springboot框架,以MyEclipse10为系统开发工具,MySQL为后台数据库,开发的一个学生综合测评系统。 SpringBoot框架 SpringBo…

操作系统【OS】多线程模型

多对一模型 一对一模型 多对多模型 定义 多个ULT映射到一个KLT 每个ULT映射到一个KLT n个ULT映射到m个KLT, n≥m 优点 线程管理在用户空间进行,效率高 一个线程被阻塞,运行调度另一个线程运行,并发能力强 克服了多对一模型…

redis - 实现周期性数据无上报检测

需求背景 以小时为周期不停地上报事件到事件平台,事件平台如果在连续2个周期 没有检测到上报的事件,就会发送告警给事件的相关责任人. 问题的难点在于如何检测连续周期内无数据? 如上图,2 点和 3 点,都没有上报数据,说明连续两个周期存在无数据上报. 解决方案 本文采用 re…

专访 Web3Go 新产品 Reiki:培育 AI 原生数字资产与创意新土壤

从 DeFi 到 NFTFi、SocialFi,web3 从业者在尝试 crypto 与区块链技术能为我们的生活、创作、娱乐和文化带来何种新体验,而生成式人工智能的突破性发展则为我们与链上世界的交互、社区内容创作等带来了新的体验,改变互动、交易和价值创造方式。…

C++入门——引用|内联函数|auto关键字|基于范围的for循环|指针空值

前言 C入门专栏是为了补充C的不足,并为后面学习类和对象打基础。在前面我们已经讲解了命名空间、输入输出、缺省参数、重载函数等,今天我们将完结C的入门。 下面开始我们的学习吧! 一、引用 1、引用是什么呢?为什么C添加了引用&a…

数据结构---HashMap和HashSet

HashMap和HashSet都是存储在哈希桶之中,我们可以先了解一些哈希桶是什么。 像这样,一个数组数组的每个节点带着一个链表,数据就存放在链表结点当中。哈希桶插入/删除/查找节点的时间复杂度是O(1) map代表存入一个key值,一个val值…

原型与原型链

一、原型:prototype 1.什么是原型? javascript常被描述为一种基于原型的语言(每个对象都拥有一个原型对象) 当访问一个对象的属性时,它不仅在该对象上寻找,还会寻找该对象的原型,以及该对象原…

【Java】人工智能交互智慧导诊系统源码

随着人工智能技术的快速发展,语音识别与自然语言理解技术的成熟应用,基于人工智能的智慧导诊导医逐渐出现在患者的生活视角中,智能导诊系统应用到医院就医场景中,为患者提供导诊、信息查询等服务,符合智慧医院建设的需…

Java利用反射和读取xml实现迷你容器

由于需要框架能实现多态,达到控制反转解耦。所以容器还是需要的,容器的存在可以简化对象获取工作,但是容器也不是万能的。合理使用即可,Spring对我来说太庞大了,用不着,为此给框架写一个迷你版容器。 容器…

Netty的高性能基石ByteBuf

前言 ​ NIO中缓冲区是数据传输的基础,JDK通过ByteBuffer实现,Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf。 ​ Netty中的ByteBuf对ByteBuffer做了大量的优化,比如说内存池,零拷贝,引用计数&#xf…

QFileDialog 文件对话框

文章目录 1、简介2、公共类型3、属性4、functions1、访问属性相关 function2、静态公共成员1、 通过对话框获取用户选择的文件路径:QFileDialog::getOpenFileName2、 通过对话框获取用户选择的文件夹路径:QFileDialog::getExistingDirectory 3、Public F…

家庭资产配置

不同家庭的资产配置 理财就是理人生 为人生的每件事,准备好相应的钱 生存的事 生活费 假设我们今年30岁,则至60岁期间所需的日常生活开支为: 4000元/月X 12月X30年144万 养老的事 养老费 吃饭居住娱乐其他开销60至80岁期间所需的养老…

用Wokwi仿真ESP-IDF项目

陈拓 2023/10/21-2023/10/21 1. 概述 Wokwi是一个在线的电子电路仿真器。你可以使用它来仿真Arduino、ESP32、STM32和许多其他流行的电路板、元器件以及传感器,免去使用开发板。 Wokwi提供基于浏览器的界面,您可以通过这种简单直观的方式快速开发一个…

农产品农货经营小程序商城的作用是什么

农产品行业涵盖的产品很多,以小麦、稻子、玉米、高粱等为主,还有粮油、果蔬、畜牧等产品。 自建技术团队,耗时耗力,培养成本较高,销售渠道单一、等客上门、产品无法高效宣传及促进用户购买,营销力不足&…

会声会影2023官方破解版激活码

随着短视频、vlog等媒体形式的兴起,视频剪辑已经成为了热门技能。甚至有人说,不会修图可以,但不能不会剪视频。实际上,随着各种智能软件的发展,视频剪辑已经变得越来越简单。功能最全的2023新版,全新视差转…

JavaWeb学生管理系统(详细源码+解析)

​ 很多人大学的第一个小项目就是使用JavaWeb实现了一个学生管理系统或者是图书管理系统。在没有项目经验的情况下,前后端都需要自己去完成,还是要耗费不少时间精力的。本次我就分享一下我在大学期间完成的第一个小项目:学生管理系统。采用的…