zoukankan      html  css  js  c++  java
  • 实现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") 已设置了所需参数。

  • 相关阅读:
    TCP/IP学习-链路层
    Linux下搭建Wordpress环境
    DiskMgr的限制项
    Win10系统Start Menu上的图标莫名消失
    powershell
    第一个页面的文本域中输入的值怎么在第二个页面中显示
    php 文本框里面显示数据库调出来的资料
    php代码
    php表单提交方法汇总
    php将SQL查询结果赋值给变量
  • 原文地址:https://www.cnblogs.com/vae860514/p/11047242.html
Copyright © 2011-2022 走看看