SpringCloud 前端-网关-微服务-微服务间实现信息共享传递

目录

1 网关获取用户校验信息并保存至请求头(前端-网关)

2 微服务获取网关中的用户校验信息(网关-微服务)

2.1 一般的做法是在公共的module中添加,此处示例为common 公共配置module中添加

2.2 定义拦截器

2.3 定义注册类

2.4 手动添加注册配置类保证被扫描

3 多个微服务之间共享该信息(微服务-微服务)

3.1 定义请求拦截器RequestInterceptor

4 前端-网关-微服务-微服务间信息共享全流程

4.1 (前端-网关)首先前端发起请求,经过GlobalFilter过滤器判断是否需要登录,需要登录的话进行登录校验,完成登录校验后获取到用户信息,存入上下文中,保存到请求头中。然后由网关传向微服务中。

4.2 (网关-微服务)微服务拦截器拦截从网关发送过来的请求,从请求头中获取到用户信息后会通过ThreadLocal保存使用。

4.3 (微服务-微服务)微服务若再向其他微服务发起请求,则通过OpenFeign提供的RequestInterceptor拦截发出的请求,并进行将用户信息保存在请求头中的操作。


1 网关获取用户校验信息并保存至请求头(前端-网关)

思路是添加过滤器,网关过滤器有两种,分别是:
GatewayFilter:路由过滤器,作用于任意指定的路由;默认不生效,要配置到路由后生效。
GlobalFilter:全局过滤器,作用范围是所有路由;声明后自动生效。
两种过滤器的过滤方法签名完全一致。

此处以GlobalFilter为例实现网关登录校验

首先定义定义全局过滤器并实现两个接口,特别说明Ordered接口是改变其权重,提升其优先级别,保证在pre阶段先执行(若不懂pre阶段请看3 网关处理流程)。过滤器定义逻辑如下,拦截符合条件的请求(常见的是需要登录的请求)-> 登录校验 -> 将信息存入上下文请求头中

@Component
@RequiredArgsConstructor
@EnableConfigurationProperties(AuthProperties.class)
public class AuthGlobalFilter implements GlobalFilter, Ordered {private final AuthProperties authProperties; //配置文件类,开发无需登录路径private final JwtTool jwtTool;  //jwt工具类 private final AntPathMatcher antPathMatcher = new AntPathMatcher(); //路径匹配    //工具类@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//    其中exchange 为上下文,在过滤器链路中负责传递信息//        1.获取request 请求ServerHttpRequest request = exchange.getRequest();
//        2.判断是否需要做登陆拦截if(isExclude(request.getPath().toString())){
//            放行return chain.filter(exchange);}//        3.获取tokenHttpHeaders headers = request.getHeaders();String token = null;List<String> authorization = headers.get("authorization");if(authorization !=null && !authorization.isEmpty()){token = authorization.get(0);}//        4.校验并解析tokenLong userId = null;try {userId = jwtTool.parseToken(token);}catch (UnauthorizedException e){
//            拦截ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);return  response.setComplete();}//        TODO 5.传递用户信息String userInfo= userId.toString();
//存入上下文ServerWebExchange swe = exchange.mutate().request(builder -> builder.header("user-info", userInfo)).build();//        6.放行 传入下一层过滤器中return chain.filter(swe);}//工具方法,用来判断是否包含在公共开放的路径中private boolean isExclude(String path) {for (String pathPattern: authProperties.getExcludePaths()) {if (antPathMatcher.match(pathPattern,path)){return true;}}return false;}
// 设置在过滤器中的级别,数字越小,级别越高,在pre过程中先执行@Overridepublic int getOrder() {return 0;}
}

关建步骤在5,通过5将用户信息存入上下文中,然后放在请求头中。即可完成将获取用户校验信息并存入请求头中。

2 微服务获取网关中的用户校验信息(网关-微服务)

获取方法是加拦截器,加在每一个微服务中,这样就会拦截从网关路由过来的请求,然后获取请求头中的用户信息,最后放在ThreadLocal中即可共享信息

2.1 一般的做法是在公共的module中添加,此处示例为common 公共配置module中添加

2.2 定义拦截器


public class UserInfoInterceptor implements HandlerInterceptor {//重写方法@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        1.获取登陆用户信息String userInfo = request.getHeader("user-info");
//        2.判断是否获取了用户 如果有 直接存入ThreadLocalif(StrUtil.isNotBlank(userInfo)){UserContext.setUser(Long.valueOf(userInfo));}
//        3.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//       业务逻辑结束清理用户信息 移除ThreadLocal中的用户信息UserContext.removeUser();return ;}
}

拦截器定义以后需要注册到spring Mvc。

2.3 定义注册类

(关于添加下面第二个注解的原因,如果不添加,默认在所有微服务中都生效,那么在启动微服务的时候,所以会自动扫描微服务中的Mvc基础配置,但在网关gateway微服务中并不是SpringMvc,因此会扫描不到而出错。添加的注解是有SpringMvc核心容器类的时候才会生效,这样就只有是SpringMvc的微服务才会生效,避免错误。)

@Configuration
@ConditionalOnClass(DispatcherServlet.class)// 添加此注解是避免在网关微服务中因扫描不到Mvc配置而出错
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {
//      registry 是注册类,调用下面的方法,添加拦截器registry.addInterceptor(new UserInfoInterceptor());}
}

像这种添加在公共包下的配置类因为不是一个spring项目,没有启动类,因此spring 默认扫描不到这个MvcConfig配置类,因此像这种公共包下的配置需要在配置文件中手动添加,如下将配置类路径添加到文件中即可被扫描到

2.4 手动添加注册配置类保证被扫描

以上情况就解决了从网关到各个微服务之间携带用户信息的问题,思路是微服务拦截网关到达的请求并获取用户信息。

3 多个微服务之间共享该信息(微服务-微服务)

思路也是添加拦截器,注意此拦截器是在加在发起请求的微服务中,拦截其发起的请求,然后将用户信息存入请求头中。因为我们使用OpenFeign,它提供了一个拦截器接口,会拦截所以请求,可以向请求头中添加信息,因此直接和Feign接口定义在一个包下。

3.1 定义请求拦截器RequestInterceptor

以下拦截器即可完成拦截发出的请求并将共享信息保存在请求头中的任务

//此处采用匿名内部类的方法,直接定义在了之前的配置类中,也可单独创建一个类
public class DefaultFeignConfig {@Beanpublic Logger.Level feignLoggerLevel(){return  Logger.Level.FULL;}//用来处理用户信息@Beanpublic RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {
//            获取用户信息,这是之前网关向微服务传递信息时存入了Thredlocal中的用户信息,取出Long userId = UserContext.getUser();if (userId!=null){
//            将获取到的用户信息存入请求头中requestTemplate.header("user-info",userId.toString());}}};}}

4 前端-网关-微服务-微服务间信息共享全流程

4.1 (前端-网关)首先前端发起请求,经过GlobalFilter过滤器判断是否需要登录,需要登录的话进行登录校验,完成登录校验后获取到用户信息,存入上下文中,保存到请求头中。然后由网关传向微服务中。

4.2 (网关-微服务)微服务拦截器拦截从网关发送过来的请求,从请求头中获取到用户信息后会通过ThreadLocal保存使用。

4.3 (微服务-微服务)微服务若再向其他微服务发起请求,则通过OpenFeign提供的RequestInterceptor拦截发出的请求,并进行将用户信息保存在请求头中的操作。

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

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

相关文章

简易五子棋

简介 使用Java实现简易五子棋 规则介绍 游戏使用一个标准的1515方格的棋盘&#xff0c;双方分别用黑白两种颜色的棋子进行对战。黑子先行&#xff0c;双方轮流在空棋盘的交叉点上落子&#xff0c;每人一次只能落一子。游戏的目标是让自己的五颗棋子连成一线&#xff0c;这条…

2024面试题【vue2】

1.关于生命周期 1.1生命周期有哪些&#xff1f;发送请求是在created还是mounted beforeCreate&#xff1a;创建之前&#xff08;el、data和message都还是undefined,不可用的&#xff09; created&#xff1a;创建完毕&#xff08;能读取到数据data的值,但是DOM还没生成&#x…

Web前端轮播结束:技术揭秘与用户体验挑战

Web前端轮播结束&#xff1a;技术揭秘与用户体验挑战 在Web前端开发中&#xff0c;轮播图作为一种常见的页面元素&#xff0c;承载着展示图片、传递信息的重要功能。然而&#xff0c;当轮播结束时&#xff0c;如何处理这一状态&#xff0c;却是一个既具挑战又充满困惑的问题。…

一分钟制作爆火的治愈插画,让插画来替你说出心声

超火的AI治愈插画来了&#xff0c;有趣的文字搭配上有趣的图&#xff0c;无论是发朋友圈还是发小红书&#xff0c;这效果简直无敌。 下面是我刚生成的&#xff0c;快来看看效果吧。 这个工具&#xff0c;国内可用&#xff0c;可以直接上手&#xff0c;不需要什么技术&#xff0…

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求&#xff0c;常用做法是左侧显示子页面菜单&#xff0c;用户通过点击左侧菜单&#xff0c;实现右边子页面的展示。 实例项目实现&#xff1a; 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0

1.stablediffusion的概述&#xff1a; Stable Diffusion&#xff08;简称SD&#xff09;近期的动态确实不多&#xff0c;但最新的发展无疑令人瞩目。StableCascade、Playground V2.5和Stableforge虽然带来了一些更新&#xff0c;但它们在SD3面前似乎略显黯然。就在昨晚&#x…

04.VisionMaster 机器视觉找圆工具

VisionMaster 机器视觉找圆工具 定义 先检测出多个边缘点然后拟合成圆形&#xff0c;可用于圆的定位与测量 注意&#xff1a;找圆工具 最好和【位置修正】模块一起使用。具体可以看下面的示例。 参数说明&#xff1a; 扇环半径&#xff1a;圆环ROI的内外圆半径 边缘类型&a…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] K小姐的服务交换接口失败率分析 (100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 K小姐的服务交换接口失败率分析(100分) 🌍 评测功能需要订…

基于.Net 框架实现WebSocket 简单通信——服务端

新建项目 创建一个.Net 框架的控制台程序。 添加包 项目 → 管理 NuGet 程序包打开包管理窗口&#xff0c;添加SuperWebSocket 程序包。 实现 项目 → 添加类打开添加新项窗口&#xff0c;添加一个C#类。 启动监听 WebSocketServer socket new WebSocketServer();Conso…

Web前端教学实录:深入剖析前端技术的奥秘

Web前端教学实录&#xff1a;深入剖析前端技术的奥秘 在数字化时代&#xff0c;Web前端技术已成为构建现代化网站和应用程序不可或缺的一环。然而&#xff0c;对于初学者来说&#xff0c;前端技术的复杂性和多样性往往令人望而生畏。为了帮助广大学习者更好地掌握Web前端技术&…

PyTorch 数学运算-Tensor基本操作

用如下 a b 进行运算演示 >>> a tensor([[0.7967, 0.5056, 0.7963],[0.8603, 0.7029, 0.7590]]) >>> b tensor([[0.6923, 0.0411, 0.8713],[0.0483, 0.2948, 0.3286]])一般加减乘除运算&#xff1a; add/mimus/multiply/divide >>…

【github】项目的代码仓库重命名

问题 有时候&#xff0c;我们先创建了远端项目仓库&#xff0c;然后就把相关code上传到远端项目仓库。 可能需要结合实际情况对远端项目仓库进行重命名。 当前仓库名称v_ttc&#xff0c;如何将他修改成v_datejs 操作步骤 1、在 GitHub.com 上&#xff0c;导航到存储库的主页…

数据库的字符集和校对规则

数据库的字符集和校对规则是数据库管理系统&#xff08;DBMS&#xff09;中处理字符数据的重要组成部分。以下是对数据库字符集和校对规则的详细解释&#xff1a; 字符集&#xff08;Character Set&#xff09; 1. 定义 字符集是一套用于表示文本字符的编码集合。它规定了如…

(金融:货币兑换)编写一个程序,提示用户输入从美元到人民币的兑换汇率。

&#xff08;金融:货币兑换)编写一个程序&#xff0c;提示用户输入从美元到人民币的兑换汇率。提示用户输入0表示从美元兑换为人民币&#xff0c;输入1表示从人民币兑换为美元。继而提示用户输入美元数量或者人民币数量&#xff0c;分别兑换为另外一种货币。下面是运行示例: pa…

Nginx之Stream(TCP/UDP)负载均衡

Nginx 的 TCP/UDP 负载均衡是应用 Stream 代理模块&#xff08;ngx_stream_proxy_module&#xff09;和 Stream 上游模块&#xff08;ngx_stream_upstream_module&#xff09;实现的。Nginx 的 TCP 负载均衡与 LVS 都是四层负载均衡的应用&#xff0c;所不同的是&#xff0c;LV…

TCP/IP协议深入解析,初学者必看!

简介 在信息技术飞速发展的今天&#xff0c;网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础&#xff0c;TCP/IP协议确保了全球范围内的数据交换和信息共享。 TCP/IP&#xff08;传输控制协议/网际协议&#xff09;是…

LeetCode 2813.子序列最大优雅度

给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_categories^2 计算&#xff0c;其中 t…

Linux Mint 21.3简介

Linux Mint 21.3是一个更新版本&#xff0c;其中包含了许多新特性和改进。以下是一些主要更新内容&#xff1a; 1. Cinnamon 6.0桌面环境&#xff1a;Linux Mint 21.3采用了最新的Cinnamon 6.0桌面环境&#xff0c;带来了新的功能和改进&#xff0c;例如支持Wayland会话&#…

通勤路上的美好伴侣:倍思H1s头戴式蓝牙耳机

在繁忙的都市生活中,通勤往往占据了人们大量的时间。而在这个过程中,无尽的嘈杂声——公交车的播报声、地铁的轰鸣声、街头的喧嚣——往往成为我们心情的干扰源。在这样的环境下,一款优质的头戴式蓝牙耳机,会让我们的通勤之旅变得更加愉快和舒适。 通勤路上要更舒适—— 倍思…

道可云元宇宙每日资讯|微软称GPT的重点将转向商业和企业场景

道可云元宇宙每日简报&#xff08;2024年6月14日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 微软称GPT的重点将转向商业和企业场景 近日&#xff0c;微软于官网宣布将于2024年7月10日起停止其AI工具Copilot GPTs服务&#xff0c;同时将删除所有由用户创建的既…