天天看點

openFeign遠端調用丢失請求頭問題

feign

遠端調用的請求頭中沒有含有

JSESSIONID

cookie

,是以也就不能得到服務端的

session

資料,

cart

認為沒登入,擷取不了使用者資訊

openFeign遠端調用丢失請求頭問題
openFeign遠端調用丢失請求頭問題
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資訊

openFeign遠端調用丢失請求頭問題

繼續閱讀