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

SpringBoot 微服务中怎么获取用户信息 token

SpringBoot 微服务中怎么获取用户信息 token

当我们写了一个A接口,这个接口需要调用B接口,但是B接口需要包含请求头内容,比如需要用户信息、用户id等内容,由于不在同一个线程中,使用ThreadLocal去获取数据是无法获取的,这个时候需要手动将信息放置请求头中。

前置知识

获取请求头方式

return BaseContext.getUserId();是我随便写的不要在意!!!

第一种 ServletRequestAttributes

通过ServletRequestAttributes获取请求。

@GetMapping("/token")
public Long getToken() {ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();String token = request.getHeader("token");return BaseContext.getUserId();
}

第二种 HttpServletRequest

@GetMapping("/token")
public Long getToken(HttpServletRequest request) {String token = request.getHeader("token");return BaseContext.getUserId();
}

第二种 通过注解

@GetMapping("/token")
public Long getToken(@RequestHeader("token") String token) {return BaseContext.getUserId();
}

操作步骤

准备好两个接口还有一个OpenFeign。

OpenFeign

@FeignClient(value = "service-admin",contextId = "IndexFeignClient", path = "")
public interface IndexFeignClient {@GetMapping("/token")Long getToken();
}

被调用接口B

@GetMapping("/token")
public Long getToken() {ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();String token = request.getHeader("token");return BaseContext.getUserId();
}

调用接口A

@GetMapping("abc")
public String index() {Long id = indexFeignClient.getToken();return "欢迎访问。。。";
}

这个时候正常去调用这个接口是无法获取到token相关信息的。

可以看到是null,因为没有将请求头传递过来。

在这里插入图片描述

传递请求头

我使用的是JWT方式,这种可以存储一些信息。使用的是注解方式存入请求头。

重写以实现对Feign请求的拦截和处理,首先通过RequestContextHolder.getRequestAttributes()方法获取ServletRequestAttributes对象,这个对象封装了当前请求的相关信息。然后将ServletRequestAttributes对象转换为ServletRequestAttributes类型,并确保它不为空。

使用requestTemplate.header("token", token)方法将获取到的token值作为请求的header添加到Feign请求模板中。这样,在发起Feign请求时,会自动将token作为请求头一并发送给目标服务。

创建UserTokenFeignInterceptor

import feign.RequestInterceptor;
import feign.RequestTemplate;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;public class UserTokenFeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();assert requestAttributes != null;HttpServletRequest request = requestAttributes.getRequest();String token = request.getHeader("token");requestTemplate.header("token", token);}
}

使用注解

使用@Import将之前的UserTokenFeignInterceptor引入。

import cn.bunny.common.utils.feign.UserTokenFeignInterceptor;
import org.springframework.context.annotation.Import;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
@Import(value = UserTokenFeignInterceptor.class)
public @interface EnableUserTokenFeignInterceptor {}

最后在接口启动类上加上这个注解,也就是在接口A的启动类上这个注解。不要加错了!!!

是接口A的启动类!!!

是接口A的启动类!!!

是接口A的启动类!!!

@EnableFeignClients(basePackages = {"cn.bunny.feign.admin"})
@SpringBootApplication
@Slf4j
@EnableUserTokenFeignInterceptor
public class ServiceWebApplication {public static void main(String[] args) {log.info("ServiceApplication启动...");SpringApplication.run(ServiceWebApplication.class, args);}
}

之后就可以看到传递成功的token

在这里插入图片描述

相关文章:

  • 《web应用技术》第9次课后作业
  • Dropbear SSH服务器的安装和优化
  • 视频集中存储LntonCVS视频监控汇聚平台智慧园区应用方案
  • 案例研究|MeterSphere助力万物云构建高效自动化测试平台
  • QA测试开发工程师面试题满分问答25: JVM瓶颈分析,举例说明
  • 读人工智能时代与人类未来笔记17_人类未来
  • 逻辑分析仪的调试使用
  • 【放球问题】920. 播放列表的数量
  • MongoDB CRUD操作:投影Project详解
  • os模块概述及常用方法
  • 【SQL学习进阶】从入门到高级应用(一)
  • 什么是GPT-4o,推荐GPT-4o的获取使用方法,使用GPT4o模型的最新方法教程(2024年5月16更新)
  • 【算法】Angelic Jelly天使果冻
  • Vue从入门到实战Day12~14 - Vue3大事件管理系统
  • 数据挖掘与机器学习——回归分析
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CAP理论的例子讲解
  • Cumulo 的 ClojureScript 模块已经成型
  • Django 博客开发教程 8 - 博客文章详情页
  • Hibernate【inverse和cascade属性】知识要点
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Js基础——数据类型之Null和Undefined
  • OSS Web直传 (文件图片)
  • SAP云平台里Global Account和Sub Account的关系
  • WebSocket使用
  • Zsh 开发指南(第十四篇 文件读写)
  • 浮动相关
  • 浮现式设计
  • 工作中总结前端开发流程--vue项目
  • 关于extract.autodesk.io的一些说明
  • 基于组件的设计工作流与界面抽象
  • 力扣(LeetCode)21
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 深度学习中的信息论知识详解
  • 通过git安装npm私有模块
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 学习JavaScript数据结构与算法 — 树
  • 用简单代码看卷积组块发展
  • 在Unity中实现一个简单的消息管理器
  • 中文输入法与React文本输入框的问题与解决方案
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Java总结 - String - 这篇请使劲喷我
  • 容器镜像
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • !$boo在php中什么意思,php前戏
  • # SpringBoot 如何让指定的Bean先加载
  • ###C语言程序设计-----C语言学习(3)#
  • #vue3 实现前端下载excel文件模板功能
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (1) caustics\
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (层次遍历)104. 二叉树的最大深度
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据