Feign¶
请求头丢失¶
在使用远程调用时,新建了一个 request 请求 ,默认没有拦截器进行处理,导致这个请求没有任何请求头。
需要自定义拦截器,把原来的请求头依次添加到新的请求中。
@Configuration
public class FeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
// 1、RequestContextHolder 获取当前的请求
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
// 原始请求 页面发起的老请求
HttpServletRequest request = attributes.getRequest();
if (request != null) {
// 获取原始请求的头数据 cookie
String cookie = request.getHeader("Cookie");
// 给feign生成的心请求设置请求头cookie
template.header("Cookie", cookie);
}
}
}
};
}
}
异步时上下文丢失¶
每一个异步任务,都会启动自己的拦截器。这些拦截器使用 ThreadLocal 获取上下文信息,但是异步中无法获得原始的请求信息,导致空指针异常
private static final ThreadLocal<RequestAttributes> requestAttributesHolder =
new NamedThreadLocal<>("Request attributes");
应该从主线程中获取请求信息,然后再异步线程中共享
// 主线程中获取请求
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> getAddressTask = CompletableFuture.runAsync(() -> {
// 异步任务获取请求信息
RequestContextHolder.setRequestAttributes(requestAttributes);
......
}, executor);