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

springcloud Feign调用拦截器(统一处理拷贝请求头实现透传信息、内部调用鉴权、打印feign调用)

springcloud Feign调用拦截器(统一处理拷贝请求头实现透传信息、内部调用鉴权、打印feign调用日志)

实现接口Feign.RequestInterceptor

实现接口 feign.RequestInterceptor 并注入到IOC容器即可生效
在这里插入图片描述

示范代码如下

  1. 拷贝请求头,将原请求信息透传下去给被调用的feign服务,部分头不拷贝,例如content-length
  2. 内部调用鉴权标记,在发起feign调用时加上标记(每天一个token,64位随机字符,在redis记录了今天的和昨天的,都有效),让内部调用时有权限调用被调服务
  3. 打印feign调用目标的日志

/*** @author humorchen* date: 2024/5/27* description: feign 请求拦截器**/
@Slf4j
public class FeignInterceptor implements RequestInterceptor {/*** 跳过某些 header* 比对时会忽略大小写*/private static final Set<String> SKIP_HEADER_NAMES = new HashSet<>(Arrays.asList("transfer-encoding", "content-length", "accept", "accept-encoding", "connection"));static {// 转换为小写,避免大小写不一致HashSet<String> lowCaseSet = new HashSet<>(SKIP_HEADER_NAMES.size());SKIP_HEADER_NAMES.forEach(name -> lowCaseSet.add(name.toLowerCase()));SKIP_HEADER_NAMES.clear();SKIP_HEADER_NAMES.addAll(lowCaseSet);}/*** Called for every request. Add data using methods on the supplied {@link RequestTemplate}.** @param template*/@Overridepublic void apply(RequestTemplate template) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();// 拷贝请求头信息,透传信息if (requestAttributes != null) {HttpServletRequest request = requestAttributes.getRequest();Enumeration<String> headerNames = request.getHeaderNames();if (headerNames != null) {while (headerNames.hasMoreElements()) {// 跳过某些 headerString name = headerNames.nextElement();if (SKIP_HEADER_NAMES.contains(name.toLowerCase())) {continue;}String values = request.getHeader(name);template.header(name, values);}}}// 内部调用鉴权标记template.header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken());// 测试环境打印log.debug("【新版权限日志】FeignInterceptor 发起Feign调用({}),请求头已拷贝,same-token已颁发。", template.url());}
}

相关文章:

  • 【C++入门到精通】C++ thread线程库 [ C++入门 ]
  • 就凭这张图,下订华为享界S9
  • Linux系统使用Docker安装Drupal结合内网穿透实现远程访问管理后台
  • CMakeFile.txt通过sysroot方式后生成makefile报错
  • 构建LangChain应用程序的示例代码:7、如何使用Amazon Personalize服务的教程
  • git随记
  • ant design vue 表格错位,表头错位
  • 【安装笔记-20240528-Linux-在 Vultr 云服务器上安装 OpenWRT】
  • DP读书:《半导体物理学(第八版)》(七) 金属与半导体的接触- 10 min 速通(载流子分布)
  • vue项目路由跳转后上一页面未完成的接口取消请求
  • 视频汇聚管理平台EasyCVR程序报错“create jwtSecret del server class:0xf98b6040”的原因排查与解决
  • springboot基本使用十一(自定义全局异常处理器)
  • 【遂愿赠书 - 1期】:安恒“网安三剑客”-大模型时代下的网络安全实战指南
  • 学生信息管理系统C++
  • 插入排序与希尔排序
  • [deviceone开发]-do_Webview的基本示例
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【5+】跨webview多页面 触发事件(二)
  • 【译】理解JavaScript:new 关键字
  • Android 控件背景颜色处理
  • CSS实用技巧
  • Debian下无root权限使用Python访问Oracle
  • dva中组件的懒加载
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaWeb(学习笔记二)
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JDK 6和JDK 7中的substring()方法
  • js
  • node和express搭建代理服务器(源码)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 技术发展面试
  • 解决iview多表头动态更改列元素发生的错误
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊一聊前端的监控
  • 前嗅ForeSpider采集配置界面介绍
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 数组的操作
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 一个JAVA程序员成长之路分享
  • 数据可视化之下发图实践
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​香农与信息论三大定律
  • !!java web学习笔记(一到五)
  • # Java NIO(一)FileChannel
  • # Maven错误Error executing Maven
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #if和#ifdef区别
  • $NOIp2018$劝退记
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (Note)C++中的继承方式
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (ZT)薛涌:谈贫说富
  • (附源码)python旅游推荐系统 毕业设计 250623