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

无情 阅读:1160 2020-03-14 13:27:13 评论:0

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

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号