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

SpringCloud -Token传递之Feign

目录

方法一 @RequestHeader

方法二 使用Feign的Interceptor

步骤一 实现RequestInterceptor接口

步骤二:配置Feign


通常微服务对于用户认证信息解析有两种方案

  • 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去。
  • 在 gateway 直接把 token 传递下去,每个子微服务自己在过滤器解析 token

现在有一个从 A 服务调用 B 服务接口的内部调用业务场景,无论是哪种方案我们都需把 header 从 A 服务传递到 B 服务。

方法一 @RequestHeader


在请求调用方的微服务方法头中添加@RequestHeader用来接收用户端请求时传入的token

@RequestMapping("/deleteByOpenId")
public Object deleteByOpenId(@RequestParam("opendId") String opendId, @RequestHeader("token") String token) {
    Object integer = appMpLoginAuthFeginClient.deleteByOpenId(opendId, token);
    return integer;
}


这里获取到header中的“token”在采用Feign调用其他微服务时将获取到的Token传入到下一个微服务的请求头中

@RequestMapping("/rest/user-service/in/mpLoginAuth/deleteByOpenId")
Object deleteByOpenId(@RequestParam("opendId") String opendId, @RequestHeader("token") String token);


这里的@RequestHeader的意思是将参数token放入到下个请求的请求头header中。


方法二 使用Feign的Interceptor


步骤一 实现RequestInterceptor接口


重写RequestInterceptor接口的apply,获取到token

public class TokenRequestIntecepor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes srat = (ServletRequestAttributes) requestAttributes;
        HttpServletRequest request = srat.getRequest();
        String token = request.getHeader("token");
        if (StringUtils.isNotBlank(token)) {
            //将token传递出去 requestTemplate.header("token", token); } } }
        }
    }
}

  1. 先获取到HTTPServletRequest
  2. 接着在从request中获取到header的“token”
  3. 将这个token传递给requestTemplate
  4. Interceptor实现之后还需要对这个Interceptor设置配置


步骤二:配置Feign


application.yaml文件中添加如下配置

feign:
  client:
    config:
    default:
      loggerLevel: full
      requestInterceptors: com.example.feigndemo.interceptor.TokenRequestIntecepor

http://www.kler.cn/news/135398.html

相关文章:

  • 【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)
  • 趣学python编程 (四、数据结构和算法介绍)
  • 【10套模拟】【7】
  • 【C++上层应用】1. 异常处理
  • 异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (二)
  • 执行sql,提示Illegal instruction(非法指令)
  • C语言——函数的嵌套调用
  • 【zabbix监控三】zabbix之部署代理服务器
  • vue 城市选择器的使用 element-china-area-data
  • 【开源】基于Vue.js的衣物搭配系统的设计和实现
  • Axure RP Pro 8 mac/win中文版:打造无限可能的原型设计工具
  • 2023下半年软件设计师考试知识点大全思维导图
  • 文件隐藏 [极客大挑战 2019]Secret File1
  • springboot(ssm大学生成绩管理系统 成绩管理平台Java(codeLW)
  • 【Spring】之初识
  • 西南科技大学814考研一
  • wpf devexpress自定义编辑器
  • 【iOS】——知乎日报第五周总结
  • SVG直线 <line>与折线 <polyline>代码示例
  • C++入门(3)—内联函数、auto、范围for、nullptr
  • 【18年扬大真题】给定有m个整数的递增有序数组a和有n个整数的递减有序数组b,将a数组和b数组归并为递增有序的数组c
  • 物联网AI MicroPython学习之语法 SPI串行外设通信
  • Kotlin 知识体系
  • 4-5学生分数对应的成绩
  • electron使用better-sqlite3打包失败(electron打包有进程没有界面)
  • 起立科技(起鸿)在第25届高交会上展示透明OLED技术创新
  • 22年+21年 计算机能力挑战赛初赛C语言程序题 题解
  • linux结束 java jar
  • Cesium 问题:输出的 纬度 latitude 是 0
  • 可以自己实现的Python小游戏,共十四个可收藏可直接拿走~