实现Feign请求拦截器,对请求header等参数进行转发

参考:Feign传递请求头信息(Finchley版本)

问题:通过Feign远程调用服务,无法传递header参数。

解决方式:实现RequestInterceptor接口(对所有的Feign请求进行拦截,从request中取参数进行构造,主要代码:requestTemplate.header(name, values))

代码:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * Feign请求拦截器(设置请求头,传递请求参数)
 *
 * @Author xxx
 * @Date 2019/6/18 16:03
 * 说明:服务间进行feign调用时,不会传递请求头信息。
 * 通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求头和请求参数。
 */
@Component
public class FeignRequestInterceptor 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);
            }
        }
        // 设置request中的attribute到header:主要是设置自行设置的token、userId等信息,以便转发到Feign调用的服务
        Enumeration<String> reqAttrbuteNames = request.getAttributeNames();
        if (reqAttrbuteNames != null) {
            while (reqAttrbuteNames.hasMoreElements()) {
                String attrName = reqAttrbuteNames.nextElement();
                String values = request.getAttribute(attrName).toString();
                requestTemplate.header(attrName, values);
            }
        }
    }
}

注:“”设置request中的attribute到header....“”部分是当前使用的开发框架需要,没必要可删除那段代码。

通过 Enumeration<String> reqAttrbuteNames = request.getAttributeNames(); 这种方式获取request的attributes,前提是通过 servlteRequest.setAttribute("name", "value") 已设置了所需参数。

原文地址:https://www.cnblogs.com/vae860514/p/11047242.html