首页 > 技术文章 > FeignClient如何共享Header以及踩坑过程

logan-w 2020-03-15 16:46 原文

问题:我们在调用feign的情况下,经常需要用到客户端所持有的header比如说auth-token,我们需要将这些header传递下去

思路:使用拦截器,在客户端拦截feign的请求,并把所需要的header传递下去

代码:

1.定义拦截器

@Configuration
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        Map<String,String> headers = getHeaders(getHttpServletRequest());
        for(String headerName : headers.keySet()){
            requestTemplate.header(headerName, getHeaders(getHttpServletRequest()).get(headerName));
        }
    }

    private HttpServletRequest getHttpServletRequest() {
        try {
            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private Map<String, String> getHeaders(HttpServletRequest request) {
        Map<String, String> map = new LinkedHashMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            if(needThisHeader(key)){
               String value = request.getHeader(key);
               map.put(key, value);
            }
        }
        return map;
    }

  private boolean needThisHeader(String headerName){
     //todo:这里写你的逻辑,哪些header需要传递,千万不能把所有的header传下去
      return true;
  }
}

2. 将拦截器注入到Spring

@Configuration
public class FeignSupportConfig {
    /**
     * feign请求拦截器
     *
     * @return
     */
    @Bean
    public RequestInterceptor requestInterceptor(){
        return new FeignInterceptor();
    }

}

 

坑:

一定不能把所有的header都往下传,这样很可能会导致在调用feign的时候,请求类型混乱,应该需要哪些header就穿哪些header

推荐阅读