当服务间用feign进行远程调用的时候。默认会出现缺少相关头信息的问题。例如Token或者cookie信息,因为在调用远程接口时,会进行RequestInterceptor的遍历,但是默认容器中是没有的,所以请求的头信息和请求参数都不会进行传递。我们可以通过实现RequestInterceptor注入容器,将请求相关信息进行传递来实现信息的转发。
首先实现RequestInterceptor接口
public class FeignBasicAuthRequestInterceptor 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);
}
}
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());
}
}
}然后可以在配置类中进行容器的注入
@Configuration
public class FeignSupportConfig {
@Bean
public RequestInterceptor requestInterceptor(){
return new FeignBasicAuthRequestInterceptor();
}
}
版权声明:本文为jsl18328504657原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。