总监:小王啊,最近项目feign调用需要传递一个公共参数,而且这里我还想在feign调用的请求头里面添加当前接口被请求时所携带的所有请求头。
我:在调用的时候加头参数呗。
总监:那不行呀,太麻烦了,我需要一个一劳永逸的方法。
我:好吧…我看看怎么弄吧。
思路:
代码实现如下:
@Configuration
public class FeignConfiguration implements feign.RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
//开启多线程调用的时候,线程并没有request,防止这里报空指针
if(attributes==null){
return;
}
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
// 跳过 content-length
if (name.equals("content-length")){
continue;
}
requestTemplate.header(name, values);
}
}
//这里最后向requestTemplate里面放入一个是否为feign调用的标记
requestTemplate.header("isFeign","true");
}
}