在做接口请求时,我们经常会在header头中增加一些鉴权信息,如token 或 jwt,那么在通过fegin从A server去调用B server的接口时,如果B server的接口需要header信息,我们需要将A sever获取的header转发到B上。
解决方式
我们需要实现Feign提供的一个接口RequestInterceptor
1@Configuration 2public class FeignConfiguration implements RequestInterceptor{ 3 private final Logger logger = LoggerFactory.getLogger(getClass()); 4 5 @Override 6 public void apply(RequestTemplate template) { 7 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder 8 .getRequestAttributes(); 9 HttpServletRequest request = attributes.getRequest(); 10 Enumeration<String> headerNames = request.getHeaderNames(); 11 if (headerNames != null) { 12 while (headerNames.hasMoreElements()) { 13 String name = headerNames.nextElement(); 14 String values = request.getHeader(name); 15 template.header(name, values); 16 17 } 18 logger.info("feign interceptor header:{}",template); 19 } 20 /* Enumeration<String> bodyNames = request.getParameterNames(); 21 StringBuffer body =new StringBuffer(); 22 if (bodyNames != null) { 23 while (bodyNames.hasMoreElements()) { 24 String name = bodyNames.nextElement(); 25 String values = request.getParameter(name); 26 body.append(name).append("=").append(values).append("&"); 27 } 28 } 29 if(body.length()!=0) { 30 body.deleteCharAt(body.length()-1); 31 template.body(body.toString()); 32 //logger.info("feign interceptor body:{}",body.toString()); 33 }*/ 34 } 35 }
在@FeignClient注解里面的属性加上configuration = FeignConfiguration.class就可以了。如
1@FeignClient(name = "a-server", configuration = FeignConfiguration.class) 2public interface AServer{ 3}
bootstrap.yml增加
1hystrix: 2 command: 3 default: 4 execution: 5 timeout: 6 enabled: false 7 isolation: 8 strategy: SEMAPHORE