问题:通过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") 已设置了所需参数。

 

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

解决spring-test中Feign问题: No qualifying bean of type 'org.springframework.cloud.openfeign.FeignContext' available详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。