feign远程调用丢失请求头问题解决

  1. 背景
    微服务调用的时候请求不会传递参数.比如调用方服务请求头中有cookie存放sessionId,而被调用方服务没有请求头,从而没有cookie信息,也就不能根据cookie中存放的sessionId获取session信息,影响后续操作.

  2. 解决办法
    通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求头和请求参数。本质是通过ThreadLocal线程共享变量实现.

  3. 单线程环境下代码实现

package com.kenai.gulimall.order.feign;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

@Configuration
public class GuliFeignConfig {
    @Bean
    public RequestInterceptor requestInterceptor(){
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                // RequestContextHolder拿到调用方请求
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                // 老请求
                HttpServletRequest request = attributes.getRequest();
                // 同步请求头数据-cookie
                String cookie = request.getHeader("cookie");
                // 给被调用方微服务同步调用方请求cookie
                template.header("cookie", cookie);
            }
        };
    }
}
  1. 多线程环境下feign远程调用丢失请求头问题
    由于RequestInterceptor接口,传递请求头和请求参数,本质是通过ThreadLocal线程共享变量实现.所以使用线程池异步调用方法时,由于不是同一个线程所以会出现问题.

  2. 多线程环境下feign远程调用丢失请求头问题解决方法
    只需要从主线程中获取请求头信息,然后在异步调用方法中再重新set一下即可.

  3. 多线程环境下feign远程调用丢失请求头问题代码实现
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值