Feign遠程調用丟失請求頭的問題


Feign遠程調用丟失請求頭的問題

feign調用過程和瀏覽器請求不一樣,瀏覽器會自動攜帶請求頭的信息,cookie,session等等,但是feign不會。

feign調用過程

首先,方法進入 invoke方法中

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (!"equals".equals(method.getName())) {
                if ("hashCode".equals(method.getName())) {
                    return this.hashCode();
                } else {
                    //執行方法通過方法名判斷方法
                    return "toString".equals(method.getName()) ? this.toString() : ((MethodHandler)this.dispatch.get(method)).invoke(args);
                }
            } else {
                try {
                    Object otherHandler = args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
                    return this.equals(otherHandler);
                } catch (IllegalArgumentException var5) {
                    return false;
                }
            }
        }

在執行發送請求之前,先封裝request信息,這里的惹quest是feign新封裝的

//在構建請求requtest
    Request targetRequest(RequestTemplate template) {
        //將項目中所有的攔截器遍歷然后放到新的攔截器里,同步攔截器的信息
        Iterator var2 = this.requestInterceptors.iterator();

        while(var2.hasNext()) {
            RequestInterceptor interceptor = (RequestInterceptor)var2.next();
            interceptor.apply(template);
        }

        return this.target.apply(template);
    }

解決辦法:

這里需要自定義個一個攔截器,將老的請求信息同步到自己的請求中

   @Bean
    public RequestInterceptor requestInterceptor() {
        return requestTemplate -> {
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            // 老的請求信息
            HttpServletRequest request = requestAttributes.getRequest();
            String cookie = request.getHeader("Cookie");
            requestTemplate.header("Cookie", cookie);
        };
    }

這樣feign調用的時候就能夠攜帶老的請求信息了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM