微服务-26.网关登录校验-OpenFeign传递用户信息

一.OpenFeign传递用户信息

前端发起的请求都会经过网关再到微服务,由于我们之前编写的过滤器和拦截器功能,微服务可以轻松获取登录用户信息。

但有些业务是比较复杂的,请求到达微服务后还需要调用其它多个微服务。比如下单业务,流程如下:

网关将用户信息传递到微服务后,交易服务在保存订单后要发起对购物车的清理,这时我们要知道清理哪个用户的购物车,因此需要用户信息,这时我们就要将用户信息从交易微服务传递到购物车微服务。这就要向购物车发起请求。

下单的过程中,需要调用商品服务扣减库存,调用购物车服务清理用户购物车。而清理购物车时必须知道当前登录的用户身份。但是,订单服务调用购物车时并没有传递用户信息,购物车服务无法知道当前用户是谁!

由于微服务获取用户信息是通过拦截器在请求头中读取,因此要想实现微服务之间的用户信息传递,就必须在微服务发起调用时把用户信息存入请求头

微服务之间调用是基于OpenFeign来实现的,并不是我们自己发送的请求。我们如何才能让每一个由OpenFeign发起的请求自动携带登录用户信息呢?

这里要借助Feign中提供的一个拦截器接口:feign.RequestInterceptor

public interface RequestInterceptor {/*** Called for every request. * Add data using methods on the supplied {@link RequestTemplate}.*/void apply(RequestTemplate template);
}

我们只需要实现这个接口,然后实现apply方法,利用RequestTemplate类来添加请求头,将用户信息保存到请求头中。这样以来,每次OpenFeign发起请求的时候都会调用该方法,传递用户信息。

二.接口实现

那么我们要将接口定义在哪里呢?很多微服务之间都要相互调用传递信息,因此我们定义在一个公共的地方。我们原来所有Feign的接口都是定义在hm-api中,因此放在这里最合适。我们之间在DefaultFeignConfig中定义该匿名内部类实现该接口。

package com.hmall.api.config;import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;// 定义一个OpenFeign配置类,用来配置OpenFeign的日志级别
public class DefaultFeignConfig {@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}@Beanpublic RequestInterceptor userInfoInterceptor() {return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {Long userId = UserContext.getUser();if (userId != null) {requestTemplate.header("user-info", userId.toString());}}};}
}

我们要在hm-api中加入hm-common依赖,要不然UserContext使用不了。

为什么我们可以从UserContext中取出userId?因为请求进来先进行交易服务,进行交易服务时是从网关转过来的。这时请求头中是带用户信息的,所有交易服务可以拿到请求头用户信息并保存到UserContext中。而交易服务向购物车服务发起请求时该拦截器会生效,此时我们从UserContext中取一定能取到,取到的是交易服务中当前登录用户,然后把他保存到请求头,那么这个请求再转发到购物车服务时自然就会带上UserContext,那么购物车服务拦截器生效时也就能取出来了。

注意,我们要将该该配置类加入到加入到交易服务上,才能起作用。

TradeApplication.java:defaultConfiguration = DefaultFeignConfig.class

package com.hmall.trade;import com.hmall.api.config.DefaultFeignConfig;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@EnableFeignClients(basePackages = "com.hmall.api.client", defaultConfiguration = DefaultFeignConfig.class)     // 启用Feign,且定义Feign的日志级别
@MapperScan("com.hmall.trade.mapper")
@SpringBootApplication
public class TradeApplication {public static void main(String[] args) {SpringApplication.run(TradeApplication.class, args);}
}

微服务登录解决方案总结

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

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

相关文章

Java:IO流——增强篇

目录 前言 一、缓冲流——让数据传输飞起来 🚀 1、缓冲思想 2、缓冲字节流 3、缓冲字符流 二、标准流——程序三大通道🚦 1、标准输入流(System.in) 2、标准输出流(System.out) 3、标准错误流(S…

指针 (六):sizeof和strlen细节强化之“做题篇”

目录 1. sizeof和strlen的对比 1.1 sizeof 1.2 strlen 1.3 sizeof 和 strlen的对比 2. 数组和指针笔试题解析 2.1 ⼀维数组 2.2 字符数组 代码1: 代码2: 代码3: 代码4: 代码5: 代码6: 2.3 二维数组 3. 指针…

java中的数据类型

1 概述 Java 是一门面向对象的编程语言,其核心原则之一是一切皆对象。然而,基本数据类型(如 int、double、char 等)并非对象,不具备对象的特性,例如不能调用方法、不能参与继承体系等。而包装类&#xff08…

【系统分析师】高分论文:论信息系统开发方法及应用

【摘要】 本文以某国有企业的 B2B 商品棉交易平台的电子商务门户网站系统(以下简称“门户网站”)建设为例,讨论信息系统开发方法及应用。本文作者认为项目实施中选择合适的开发方法,既能满足用户需求,又能提高整个项目…

开源 C++ QT Widget 开发(七)线程--多线程及通讯

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 C QT Widget 开发(一)工程文件结构-CSDN博客 开源 C…

CPU-IO-网络-内核参数的调优

CPU-IO-网络-内核参数的调优CPU-IO-网络-内核参数的调优一、CPU 资源调优1.1 调整进程优先级(nice 值)1.2 设置 CPU 亲和力(taskset)1.3 cpu命令描述1.4 使用 vmstat 分析系统瓶颈二、磁盘 I/O 调优2.1 ulimit 资源限制2.2 测试磁…

JavaScript 实战进阶:工程化、性能与未来展望

一、JavaScript 工程化实践 随着前端项目规模的扩大,“工程化”成为提升开发效率、保证代码质量的核心手段。它涵盖模块化设计、构建工具链、代码规范与测试等多个维度。 (一)模块化开发 模块化是将复杂代码拆分为可复用、可维护的独立单元的…

破局与增长:全球电商的业财一体化战略与数字化未来

一、全球电商的数字化转型背景在瞬息万变的全球电商市场中,数字化转型已经成为企业保持竞争力的必由之路。近年来,国内品牌出海企业快速扩张,业务范围覆盖数十个国家和平台。然而,随着规模的几何级增长,行业普遍面临以…

Excel怎么换行?3种单元格内换行方法?【图文详解】Excel自动换行?Alt+Enter?

一、问题背景 在日常使用 Excel 处理数据时,很多人会遇到这样的困扰:输入长文本(比如产品说明、多行备注、地址信息等)时,文字会一直横向延伸,不仅导致单元格变宽、表格排版混乱,还可能遮挡相邻…

【生产实践】局域网多服务器多用户SSH登录批量测试(附完整shell脚本)

在企业运维场景中,局域网内多台服务器的SSH登录凭据(用户名/密码)验证是高频需求——无论是新服务器部署后的凭据校验,还是定期安全巡检中的凭据有效性检查,手动逐台逐用户测试不仅效率低下,还容易出错。 本…

专题:2025人工智能2.0智能体驱动ERP、生成式AI经济现状落地报告|附400+份报告PDF、原数据表汇总下载

原文链接:https://tecdat.cn/?p43713 2025年,人工智能正从技术概念快速渗透到产业实操层面——大模型推理能力的突破让复杂任务自动化成为可能,AI代理的规模化应用重构企业效率边界,而AI企业“天生全球化”的特性更是打破了传统创…

机器学习--支持向量机

目录 一、为什么需要 SVM?先解决 “怎么分才好” 的问题 二、SVM 的核心:什么是 “最好的超平面”?用 “间隔” 说话 1. 先搞懂两个关键概念 2. 目标:把 “间隔” 拉到最大 三、从 “想要最大间隔” 到 “解数学问题”&#…

Multi-output Classification and Multi-label Classification|多输出分类和多标签分类

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章,有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn,这里还有很多有关计算机的知识,欢迎进行留言或…

【目标检测】论文阅读5

Small-object detection based on YOLOv5 in autonomous driving systems 发表期刊:Pattern Recognition Letters;发表时间:2023年 论文地址 摘要 随着自动驾驶领域的快速发展,对更快、更准确的目标检测框架的需求已经成为必要。…

Playwright进阶指南 (6) | 自动化测试实战

2025企业级测试解决方案:从单测到千级并发,打造高可用测试体系一、为什么传统自动化测试难以落地?根据2025年最新行业调研,测试项目失败的三大核心原因:失败原因占比典型表现维护成本过高45%选择器频繁失效&#xff0c…

uv 简单使用

二进制安装 powershell -ExecutionPolicy Bypass -c "irm https://ghproxy.cn/https://github.com/astral-sh/uv/releases/download/0.8.13/uv-installer.ps1 | iex"版本号:0.8.13,自行更改github加速前缀:https://ghproxy.cn/ 配置…

Linux程序管理

目录 一、Linux程序与进程 1、程序,进程,线程的概念 2、程序和进程的区别 3、进程和线程的区别 二、Linux进程基础(生命周期) 1、进程生命周期 2、父子进程的关系 三、程序管理 1、课程目标 2、常见的软件包类型 3、安装方法 使用独立的rpm包安装 rpm包的命名方法…

Linux-进程替换exec

文章目录进程替换exec 函数族使用说明查看命令的路径 which测试 execl测试 execlp测试 execv测试 execvp进程替换 概述 在 Windows 平台下,我们可以通过双击运行可执行程序,让这个可执行程序成为一个进程;而在 Linux 平台,我们可…

Seaborn数据可视化实战:Seaborn数据可视化实战入门

Seaborn数据可视化实战:从数据到图表的完整旅程 学习目标 通过本课程的学习,你将能够掌握使用Seaborn进行数据可视化的完整流程,从数据准备到图表设计,再到最终的图表呈现。本课程将通过一个具体的项目案例,帮助你全面…

控制系统仿真之时域分析(二)

一、时域分析法时域分析法是从传递函数出发直接在时域上研究控制系统性能的方法,实质上是研究系统在某典型输入信号下随时间变化的曲线,从而分析系统性能。控制系统的时域响应决定于系统本身的参数和结构,还有系统的初始状态,以及…