问题
- 项目中我使用feign进行远程调用时,在请求头设置了参数(UserId),结果在调用方却收获取不到...

解决办法
- feign提供了一个拦截器,在远程调用之前执行

核心代码
package com.qbb.qmall.web.feign;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* @author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)
* @version 1.0
* @date 2022-06-04 23:04
* @Description:远程调用拦截器
*/
@Component
public class UserHeaderRequestInterceptor implements RequestInterceptor {
/**
* ThreadLocal<HttpServletRequest> : 可以使用ThreadLocal自己存
* RequestContextHolder : 也可以使用Spring框架自己提供的
*/
@Override
public void apply(RequestTemplate requestTemplate) {
// 每个线程会有一个请求对象
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 获取原来请求中的数据
String userId = requestAttributes.getRequest().getHeader("UserId");
String UserTempId = requestAttributes.getRequest().getHeader("UserTempId");
if (userId != null) {
// 设置到通过模板new的新的请求中
requestTemplate.header(
"UserId", userId);
}
if (UserTempId != null) {
// 设置到通过模板new的新的请求中
requestTemplate.header(
"UserTempId", UserTempId);
}
}
}