feign远程调用丢失请求头及异步丢失上下文问题

存在问题:Feign远程调用丢失请求头问题
feign在远程调用之前要构造请求,调用了很多的拦截器
1.浏览器发送请求,请求头自动带来了cookie 到order服务
2.order服务通过feign远程调用 cart服务
feign会创建一个新的request【这个请求没有带任何请求头】
没有带请求头,cart服务就认为没登录
解决:加上feign远程调用的请求拦截器

1、feign远程调用丢失请求头问题

feign请求调用之前将之前请求拦截数据放到feign调用的拦截请求数据中;如下配置

@Configuration
public class FeignConfig {

    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

                if (requestAttributes != null) {
                    HttpServletRequest request = requestAttributes.getRequest();//老请求
                    if (request != null) {
                        //同步请求头数据
                        String cookie = request.getHeader("Cookie");
                        template.header("Cookie", cookie);
                    }
                }
            }
        };
    }
}

2、feign远程异步调用丢失上下文问题

异步情况下保证主线程的ThreadLocal和附线程用同一个线程
 RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
CompletableFuture.runAsync(() -> {
            //附带当前请求拦截器数据
            RequestContextHolder.setRequestAttributes(requestAttributes);
            //TODO 
        }, executor);

你可能感兴趣的:(java,开发语言)