问题:
在使用feign远程调用微服务的时候本服务是登录状态,但是调用其他服务就是未登录状态
原因:
这是因为feign调用的时候会重新构造一个新的请求,默认情况下,这个新的请求是不带任何的请求头的
解决:
查询源码之后发现feign在发起请求之前会先经过拦截器,那么我们只要给feign设置拦截器,使得feign的新请求获得原请求的请求头,那么就不会丢失数据了
流程图:
代码:
@Configuration
public class GuliFeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor(){
RequestInterceptor requestInterceptor = new RequestInterceptor(){
/**
*
* @param template 为 feign 构造请求的模板,也就是新的请求
*/
@Override
public void apply(RequestTemplate template) {
//1、使用RequestContextHolder拿到刚进来的请求数据
// RequestAttributes -> AbstractRequestAttributes -> ServletRequestAttributes
// RequestContextHolder 内部是由ThreadLocal实现的
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes != null){
// 这个就是原来controller最初的请求,
HttpServletRequest request = requestAttributes.getRequest();
if (request != null){
String cookie = request.getHeader("Cookie");
template.header("Cookie", cookie);
}
}
}
};
return requestInterceptor;
}
}