实现Feign请求拦截器,对请求header等参数进行转发详解编程语言

问题:通过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://blog.ytso.com/tech/pnotes/17410.html

(0)
上一篇 2021年7月19日 20:10
下一篇 2021年7月19日 20:10

相关推荐

发表回复

登录后才能评论