问题:通过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”) 已设置了所需参数。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/17410.html