Feign调用远程服务时传递Cookie信息

@Configuration
public class TtpfFeignConfig {
    @Bean
    public RequestInterceptor requestInterceptor(){//Feign同步请求头
        return template -> {
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (requestAttributes != null) {
                HttpServletRequest request = requestAttributes.getRequest();
                template.header("Cookie",request.getHeader("Cookie"));
            }
        };
    }
}

Feign调用post方法丢失数据,可能是请求头参数丢失导致服务提供方无法正确识别请求,以下是一些可行的解决方案: - **获取上下文请求头发送至Feign请求**:在调用接口feign,获取当前请求头信息`headerMap`(从`RequestContextUtil`工具中获取请求头),将其放入feign的请求中。例如方法a中调用接口feign,获取`headerMap`后,在调用feign配置类相关方法,保证能正确传递请求头信息,避免出现获取为空的情况 [^2]。 - **自定义拦截器传递请求头**:重新定义feign远程调用的拦截器,在调用feign方法之前将请求头数据同步给新请求。示例代码如下: ```java 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 FeignConfig { @Bean("requestInterceptor") public RequestInterceptor requestInterceptor(){ return new RequestInterceptor() { @Override public void apply(RequestTemplate template) { // RequestContextHolder拿到刚进来的请求 ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (requestAttributes != null) { // 老请求 HttpServletRequest request = requestAttributes.getRequest(); if (request != null){ // 将需要共享的头数据再一次放入新请求的头数据中 String cookie = request.getHeader("Cookie"); template.header("Cookie", cookie); } } } }; } } ``` 此代码通过自定义拦截器,将老请求中的`Cookie`头信息同步到新的Feign请求中,可根据实际需求添加其他需要同步的头信息 [^4]。 - **使用`Feign.builder()`写入拦截器**:利用`Feign.builder()`将自定义的拦截器`FeignHeaderInterceptor`写入配置。示例代码如下: ```java import feign.Client; import feign.Contract; import feign.Feign; import feign.RequestInterceptor; import feign.codec.Decoder; import feign.codec.Encoder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Data @Configuration @SuppressWarnings("all") @Import(FeignClientsConfiguration.class) public class RunSqlConfigTESt { @Bean public TestFeign testFeign(Client client, Encoder encoder, Decoder decoder, Contract contract) { return Feign.builder().client(client) .encoder(encoder) .decoder(decoder) .contract(contract) .requestInterceptor(new FeignHeaderInterceptor()) .target(TestFeign.class, "http://lzy-test"); } } ``` 通过这种方式保证请求头参数能传递服务提供方 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yfeil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值