使用springcloud feign时 token认证

2023-11-10

我们在项目中使用feign进行调用时,往往需要进行身份验证,而feignclient需要按照http调用方的格式来书写,这时候呢,我们可以使用这种方式来进行加入身份验证。

public class FeignConfig implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //添加token
        requestTemplate.header("Authorization", request.getHeader("Authorization"));
    }
}

当然,这里可以传入你所有想加入的参数,包括token啊,cookie,或者其他自定义的参数。 然后在feignclient的时候加入该配置就可以了

@FeignClient(contextId = "xxx",value = "xx",configuration = FeignClient.class);

但是这样的话,每一个定义的feignclient都需要去加这个配置,感觉比较麻烦, 然后查看源码 FeignClientsRegistrar

	public void registerBeanDefinitions(AnnotationMetadata metadata,
			BeanDefinitionRegistry registry) {
		registerDefaultConfiguration(metadata, registry);
		registerFeignClients(metadata, registry);
	}

这里有2个方法,一个是加载默认配置,一个是注册bean,而在注册bean的时候,加载了我们刚才的配置。

if (candidateComponent instanceof AnnotatedBeanDefinition) {
					// verify annotated class is an interface
					AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
					AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
					Assert.isTrue(annotationMetadata.isInterface(),
							"@FeignClient can only be specified on an interface");

					Map<String, Object> attributes = annotationMetadata
							.getAnnotationAttributes(
									FeignClient.class.getCanonicalName());

					String name = getClientName(attributes);
					registerClientConfiguration(registry, name,
							attributes.get("configuration"));

					registerFeignClient(registry, annotationMetadata, attributes);
				}

而默认配置registerDefaultConfiguration(metadata, registry);

private void registerDefaultConfiguration(AnnotationMetadata metadata,
			BeanDefinitionRegistry registry) {
		Map<String, Object> defaultAttrs = metadata
				.getAnnotationAttributes(EnableFeignClients.class.getName(), true);

		if (defaultAttrs != null && defaultAttrs.containsKey("defaultConfiguration")) {
			String name;
			if (metadata.hasEnclosingClass()) {
				name = "default." + metadata.getEnclosingClassName();
			}
			else {
				name = "default." + metadata.getClassName();
			}
			registerClientConfiguration(registry, name,
					defaultAttrs.get("defaultConfiguration"));
		}
	}

由Map<String, Object> defaultAttrs = metadata
                .getAnnotationAttributes(EnableFeignClients.class.getName(), true);这个可知,默认的配置是在EnableFeignClients里进行设置的,所以,通用的配置我们也找到了,直接在EnableFeignClients里设置@EnableFeignClients(basePackages = {"xxx.xxx.xxx"},defaultConfiguration =  FeignConfig.class) 这样在FeignClient就不用去每个都设置了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用springcloud feign时 token认证 的相关文章

随机推荐

  • 9 种方法使用 Amazon CodeWhisperer 快速构建应用

    Amazon CodeWhisperer 是一款很赞的生成式人工智能编程工具 自从在工作中使用了 CodeWhisperer 我发现不仅代码编译的效率有所提高 应用开发的工作也变得快乐起来 然而 任何生成式 AI 工具的有效学习都需要初学者
  • redis的5种数据类型

    1 redis的5种数据类型 string 字符串 可以为整形 浮点型和字符串 统称为元素 list 列表 实现队列 元素不唯一 先入先出原则 set 集合 各不相同的元素 hash hash散列值 hash的key必须是唯一的 sort
  • 动态规划+状态压缩思路解决旅行者问题

    问题描述 小明目前在做一份毕业旅行的规划 打算从北京出发 分别去若干个城市 然后再回到北京 每个城市之间均乘坐高铁 且每个城市只去一次 由于经费有限 希望能够通过合理的路线安排尽可能的省一些路上的花销 给定一组城市和每对城市之间的火车票的价
  • 区块链技术在日常生活有那些影响?

    区块链首先是一种社会思潮 它预示着人类社会转型 换代的新时代的到来 区块链的技术基础是分布式网络架构 正是因为分布式网络技术的成熟 去中心 弱中心 分中心及共享 共识 共担的组织架构 商业架构和社会架构才有可能有效建立起来 大概就是从工程技
  • js实现约瑟夫问题(数目的游戏问题编程)

    17世纪的法国数学家加斯帕在 数目的游戏问题 中讲了这样一个故事 15个教徒和15 个非教徒在深海上遇险 必须将一半的人投入海中 其余的人才能幸免于难 于是想了一个办法 30个人围成一圆圈 从第一个人开始依次报数 每数到第九个人就将他扔入大
  • 将一个整数逆序输出·正序输出它的每一位数字

    逆序输出n的每位数字 void PrintReverse int n 定义一个函数 他的数据类型为整型 if n lt 0 printf n n 对于负数的整数 改变输出 的多少 do printf d n 10 当n不等于0时 n对10取
  • JAVA不可达代码

    说明这句代码之前有一个死循环 解决方法 一般是需要将代码放入死循环代码中 并设定一个停止循环代码的条件
  • golang jsoniter extension 处理动态字段

    1 背景 golang 原生 json 包 在处理 json 对象的字段的时候 是需要严格匹配类型的 但是 实际上 当我们与一些老系统或者脚本语言的系统对接的时候 有时候需要对类型需要做一下兼容 假设我们有以下需求 目标类型 输入 解析后
  • 图灵奖得主Judea Pearl:因果推断论文本周推荐(2022.8.8)

    刚刚 图灵奖得主 因果科学之父Judea Pearl 在推特上推荐了本周值得一读的10篇近期发表的因果推断相关论文 推荐列表下载 他评价道 他看到了人们对于 公平 责任 主题的兴趣日益浓厚 为帮助大家快速了解这些文章的主旨内容 我将推荐列表
  • python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫 Scrapy框架 Scrapy selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段 对使用scrapy selenium进行政策文本爬虫进行记录 用于个人爬虫学习记录 可供参考 由于近期较忙 记录得较粗糙 望
  • Windows10中Anaconda3安装手动设置环境变量以及安装pymysql

    安装Anaconda3时 在这一步 要把上面的设置环境变量勾选 这里由于我不想再卸载安装一次 所以是从网上找的图 这样安装好是没有问题的 如果我们没有勾选这个选项 那就需要我们手动配置环境变量了 首先点击win 找到Anaconde3的安装
  • 一、Confluence版本概述+服务器要求+安装前系统规划

    文章目录 一 Confluence版本概述 二 服务器要求 1 操作系统 2 硬件需求 3 云服务器推荐 三 安装前系统规划 整个安装过程将涉及到的目录 Linux系统 一 Confluence版本概述 Confluence根据安装方式来分
  • 重装Ubuntu系统(单系统)

    更新nvidia驱动后 重启电脑 无法打开 黑屏并且只有左上角有横杠闪烁 网上方法都不成功 于是决定重装系统 一 保存文件 1 开机并插入U盘 在黑屏界面 ctrl alt F1进入tty 输入用户账号密码进入 2 查看磁盘信息df命令 仅
  • Ubuntu18.04安装jdk1.8

    1 卸载Ubuntu18 04自带的openjdk Ubuntu18 04系统一般是自带openjdk的 首先要卸载openjdk然后再安装自己的jdk sudo apt get remove openjdk 2 Oracle官网下载jdk
  • Java自动化测试面向对象之package

    Java自动化测试面向对象之package 文章目录 Java自动化测试面向对象之package Java 包 package Java 包 package 为了更好地组织类 Java 提供了包机制 用于区别类名的命名空间 包的作用 1 把
  • vue3 自定义组件 v-model 原理解析

    1 input 中的 v model
  • 史诗级的突破,如何让GPT接口调用能绕过4000 tokens 的长度限制

    最近很高兴有机会较为全面深入地研究GPT ChatGPT这一热门技术 学到了不少东西 当然也遇到不少问题 其中一个问题就是 所有的GPT模型 都会有输入输出长度 加起来 的限制这个问题 就好像一个紧箍咒似的 我这段时间看到很多不同的一些办法
  • 过度绘制和渲染

    最近在解过度绘制的问题单时 对过度绘制和渲染进行了简要的学习 UI优化和UI渲染 UI 优化究竟指的是什么呢 应该包含两个方面 一个是效率的提升 我们可以非常高效地把 UI 的设计图转化成应用界面 在不同并且保证 UI 界面尺寸和分辨率的手
  • JMX经验点滴

    使用Java构建的大规模分布式架构网站 为了了解整个网站中的每个节点运行状况 在考虑性能 开发速度而不考虑多开发语言支持的情况下 JMX无疑是最适合的方式 JMX Java 管理扩展 Java Management Extensions 是
  • 使用springcloud feign时 token认证

    我们在项目中使用feign进行调用时 往往需要进行身份验证 而feignclient需要按照http调用方的格式来书写 这时候呢 我们可以使用这种方式来进行加入身份验证 public class FeignConfig implements