问题:feign远程调用时,会构造很多拦截器(RequestInterceptor interceptor : requestInterceptors),并且在进行URL跳转时,会创建一个新的请求模板,并且这个新的请求没有任何请求头,这样就会导致信息丢失。
解决方案:添加一个feign远程调用的拦截器RequestInterceptor。其原理是:在feign进行远程调用的时候,会被拦截器拦截到,并且通过RequestContextHolder上下文环境保持器来获取旧请求的头信息,放入新的请求中去,从而防止头信息丢失。
@Configuration
public class feignConfig {
//将拦截器放入RequestInterceptor
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor(){
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
//上下文环境保持器,用来获取当前请求属性
//转换成ServletRequestAttributes,就可以获取到当前的请求对象
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();//旧的请求
//同步所有请求头信息,主要是cookie
String cookie = request.getHeader("Cookie");
//在新请求中放入旧请求的cookie
requestTemplate.header("Cookie",cookie);
}
};
}
}