feign
遠端調用的請求頭中沒有含有
JSESSIONID
的
cookie
,是以也就不能得到服務端的
session
資料,
cart
認為沒登入,擷取不了使用者資訊
Request targetRequest(RequestTemplate template) {
for (RequestInterceptor interceptor : requestInterceptors) {
interceptor.apply(template);
}
return target.apply(template);
}
但是在
feign
的調用過程中,會使用容器中的
RequestInterceptor
對
RequestTemplate
進行處理,是以我們可以通過向容器中導入定制的
RequestInterceptor
為請求加上
cookie
。
public class GuliFeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
//1. 使用RequestContextHolder拿到老請求的請求資料
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest request = requestAttributes.getRequest();
if (request != null) {
//2. 将老請求得到cookie資訊放到feign請求上
String cookie = request.getHeader("Cookie");
template.header("Cookie", cookie);
}
}
}
};
}
}
- RequestContextHolder為SpingMVC中共享request資料的上下文,底層由ThreadLocal實作
經過RequestInterceptor處理後的請求如下,已經加上了請求頭的Cookie資訊