通过拦截器

通过实现Feign的RequestInterceptor接口,重写里面的apply方法,为RequestTemplate添加请求头信息

@Component
public class FeignClientsConfigurationCustom implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
    // 此种方式是线程安全的
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
    // 不为空时取出请求中的header 原封不动的设置到feign请求中
        if (null != attributes) {
            HttpServletRequest request = attributes.getRequest();
            if (null != request) {
        // 遍历设置 也可从request取出整个Header 写到RequestTemplate 中
                Enumeration<String> headerNames = request.getHeaderNames();
                if (headerNames != null) {
                    while (headerNames.hasMoreElements()) {
                        String name = headerNames.nextElement();
                        String values = request.getHeader(name);
                        requestTemplate.header(name, values);
                    }
                }
            }
        }
    }
}

@Headers注解

@FeignClient(name = "testClient", configuration = FeignClientsConfigurationCustom.class)
public interface testServer{

    @GetMapping("/test")
    @Headers({"Content-Type: application/json","Accept: application/json"})
    String test(@RequestParam String param);
}

异步

无法直接通过获取HttpServletRequest来获取Header,那么可以稍微改造一下,在原来的基础上添加一个拦截器。 所有的请求过来的时候,在拦截器中将Header先取出来,然后设置到本线程私有的Map中。

原来的apply方法在提交请求的时候再通过ThreadLocal提供的remove方法,清除掉。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐