关于解决Feign传递时缺少请求头信息和参数问题

当服务间用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版权协议,转载请附上原文出处链接和本声明。