SpringCloud请求头参数传递丢失解决方案

本文介绍了在SpringCloud中遇到请求头参数在异步处理中丢失的问题及其解决方案。内容涉及手工创建线程、线程池、@Async注解、Feign调用等场景,并提出在异步线程中多次调用Feign接口时,如何确保请求头参数的传递,通过ThreadLocal和RequestContextHolder来保存和获取请求属性。
摘要由CSDN通过智能技术生成

问题描述

我们在使用基于SpringCloud微服务框架时,通常会使用到token,然后通过认证中心生产token后,所有的请求头携带该token,来验证当前请求的合法性,对于同步请求没有任何问题,当我们使用到了异步编程时,就有可能在子线程里获取不到这些请求头的参数。本篇文章针对异步+Feign调用遇见的一些问题做一个记录,避免其他人踩坑.


解决方案

以下解决方案主要是从目前主流的几种异步方式来提供各自的解决方案.

一、常用的异步方式

  1. 手工创建线程(不推荐)
  2. 手工创建线程池
  3. @Async注解

二、请求头参数获取方式

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

// 获取当前线程的RequestAttribute,实际上是从一个ThreadLocal里获取的
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
// 转换为ServletRequest对象
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
// 获取请求头参数
String authorization = request.getHeader("Authorization");

三、解决方案

1.手工创建线程

方式1:

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

public void newThread(){
   
        // 获取主线程的requestAttribute对象
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

        Thread thread = new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                // 手工set到子线程里
                RequestContextHolder.setRequestAttributes(requestAttributes, 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值