在做接口請求時,我們經常會在header頭中增加一些鑒權信息,如token 或 jwt,那么在通過fegin從A server去調用B server的接口時,如果B server的接口需要header信息,我們需要將A sever獲取的header轉發到B上。
解決方式
我們需要實現Feign提供的一個接口RequestInterceptor
@Configuration
public class FeignConfiguration implements RequestInterceptor{
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void apply(RequestTemplate template) {
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);
template.header(name, values);
}
logger.info("feign interceptor header:{}",template);
}
/* Enumeration<String> bodyNames = request.getParameterNames();
StringBuffer body =new StringBuffer();
if (bodyNames != null) {
while (bodyNames.hasMoreElements()) {
String name = bodyNames.nextElement();
String values = request.getParameter(name);
body.append(name).append("=").append(values).append("&");
}
}
if(body.length()!=0) {
body.deleteCharAt(body.length()-1);
template.body(body.toString());
//logger.info("feign interceptor body:{}",body.toString());
}*/
}
}
在@FeignClient注解里面的屬性加上configuration = FeignConfiguration.class就可以了。如
@FeignClient(name = "a-server", configuration = FeignConfiguration.class)
public interface AServer{
}
bootstrap.yml增加
hystrix: command: default: execution: timeout: enabled: false isolation: strategy: SEMAPHORE
