問題:通過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") 已設置了所需參數。