實現Feign請求攔截器,對請求header等參數進行轉發


參考:Feign傳遞請求頭信息(Finchley版本)

問題:通過Feign遠程調用服務,無法傳遞header參數。

解決方式:實現RequestInterceptor接口(對所有的Feign請求進行攔截,從request中取參數進行構造,主要代碼:requestTemplate.header(name, values))

代碼:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * Feign請求攔截器(設置請求頭,傳遞請求參數)
 *
 * @Author xxx
 * @Date 2019/6/18 16:03
 * 說明:服務間進行feign調用時,不會傳遞請求頭信息。
 * 通過實現RequestInterceptor接口,完成對所有的Feign請求,傳遞請求頭和請求參數。
 */
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                requestTemplate.header(name, values);
            }
        }
        // 設置request中的attribute到header:主要是設置自行設置的token、userId等信息,以便轉發到Feign調用的服務
        Enumeration<String> reqAttrbuteNames = request.getAttributeNames();
        if (reqAttrbuteNames != null) {
            while (reqAttrbuteNames.hasMoreElements()) {
                String attrName = reqAttrbuteNames.nextElement();
                String values = request.getAttribute(attrName).toString();
                requestTemplate.header(attrName, values);
            }
        }
    }
}

注:“”設置request中的attribute到header....“”部分是當前使用的開發框架需要,沒必要可刪除那段代碼。

通過 Enumeration<String> reqAttrbuteNames = request.getAttributeNames(); 這種方式獲取request的attributes,前提是通過 servlteRequest.setAttribute("name", "value") 已設置了所需參數。

 


免責聲明!

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



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