在我之前的文章服务网关Spring Cloud Zuul中,将用户的登录id放在了请求头中传递给内部服务。但是当内部服务之间存在feign调用时,那么请求头信息会在feign请求的时候传递吗?不会,请求的头信息和请求参数都不会进行传递。但是我们可以通过通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求头和请求参数。

1. 实现RequestInterceptor接口

import feign.RequestInterceptor;
import feign.RequestTemplate;
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 simon* @create 2018-09-07 9:51**/
public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {@Overridepublic 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);}}}
}

这里只设置了请求头,如果想传递请求参数,可以参考如下代码:

public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {@Overridepublic 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);}}Enumeration<String> bodyNames = request.getParameterNames();StringBuffer body =new StringBuffer();if (bodyNames != null) {while (bodyNames.hasMoreElements()) {String name = bodyNames.nextElement();String values = request.getParameter(name);body.append(name).append("=").append(values).append("&");}}if(body.length()!=0) {body.deleteCharAt(body.length()-1);template.body(body.toString());logger.info("feign interceptor body:{}",body.toString());}}
}

2. 注册配置

package com.southgis.ibase.personalConfigure.config;import com.southgis.ibase.utils.FeignBasicAuthRequestInterceptor;
import com.southgis.ibase.utils.FeignSpringFormEncoder;
import feign.RequestInterceptor;
import feign.codec.Encoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Feign配置注册(全局)** @author simon* @create 2018-08-20 11:44**/
@Configuration
public class FeignSupportConfig {/*** feign请求拦截器** @return*/@Beanpublic RequestInterceptor requestInterceptor(){return new FeignBasicAuthRequestInterceptor();}
}

这个文件放在项目的扫描目录下,所有的feign调用都会使用此配置。如果只有某个feign调用则可以这样设置(但配置类不能在扫描目录下):

@FeignClient(name = "organ",path = "/organ/OrganInfo",configuration = FeignSupportConfig.class)

Feign传递请求头信息相关推荐

  1. restTemplate请求设置请求头信息

    //设置请求头信息 HttpHeaders httpHeaders=new HttpHeaders(); //发送请求头格式 为json/编码为utf-8 httpHeaders.setContent ...

  2. FeignClient设置请求头信息

    FeignClient设置请求头信息 1. FeignClient概述 2. FeignClient设置请求头信息 2.1 实现方式一 2.2 实现方式二 1. FeignClient概述 这里所说的 ...

  3. Ajax学习:Ajax设置请求头信息

    在前面的学习中: 请求报文的:请求行可以设置,请求体可以设置 下面是设置请求头信息 响应头的位置在: <script>//获取元素对象const result = document.get ...

  4. php 设置http 请求头信息,php设置http头

    朋友忽然提了个问题,说自己模拟请求发送的时候和在浏览器中直接访问返回的字符串不一样,我猜应该是http头的问题,在浏览器中复制出来请求头信息,模拟和浏览器请求头一样的信息发送过去,问题解决. $hea ...

  5. 通过severlet获取请求头信息

    为什么80%的码农都做不了架构师?>>>    Accept-Charset:浏览器可接受的字符集. Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip. ...

  6. Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之14.Servlet请求头信息

    –典型的请求头信息 –读取HTTP请求头 –使用表格显示所有请求头信息 –理解各种请求头的含义 –区分不同的浏览器类型 ##############Michael分割线################ ...

  7. openresty获取nginx请求头信息

    vi test.lua:在nginx.conf配置文件中已经指定了lua脚本了 获取到请求头信息可以帮助我们做什么呢? ①比如对同一请求url,实际上也可以认定为是同一请求用户,可以限定其单位时间内的 ...

  8. SpringMVC的请求-获得请求参数-获得请求头信息

    使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name) @RequestHeader注解的属性如下: value:请求头的名称 req ...

  9. python token发送请求_python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息...

    python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息 登录接口代码: 在这里插入图片描述 登陆后返回的结果是: 在这里插入图片描述 新增渠道接口: 新增渠道接口需 ...

最新文章

  1. HYSTRIX实现主线程和子线程的THREADLOCAL上下文传递
  2. AJPFX实例集合嵌套之ArrayList嵌套ArrayList
  3. python中的Xpath方法总结
  4. activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试
  5. Linux free 命令详解
  6. 【非公开】机顶盒相关
  7. c++ 函数中定义函数
  8. Sampled Softmax,你真的会用了吗?
  9. Delphi的5种方法类型
  10. 使用计算机软件签什么合同,软件使用许可有哪些种类,签软件使用许可合同注意事项...
  11. 用VMware克隆CentOS 6.4后修改HWaddr
  12. 计算机专业有必要数学竞赛吗,高中数学竞赛必要吗
  13. 计算机丢失lzma.dll,修复7z lzma.dll
  14. Ebean报错java.lang.ClassCastException: com.project.model.xxx cannot be cast to com.project.model.xxx
  15. IE 零日漏洞风险评估
  16. 技术分享 | 如何计算 MySQL 的 QPS/TPS
  17. 用Python制作动态二维码,一行代码就做到了
  18. C语言——线性表 (数据结构)
  19. VOIP MTK 网络电话 节费软件 IP电话
  20. 【Solidity】零基础入门Solidity编写智能合约代码

热门文章

  1. 微信小程序开发工具安装破解
  2. 今日头条 爬虫 java_Java爬虫实践:Jsoup+HttpUnit爬取今日头条、网易、搜狐、凤凰新闻...
  3. 操作系统考研复习——第四章(文件管理)
  4. 中国工程院院士刘韵洁:中国未来网络创新环境CENI的探索
  5. 精读论文:Learning multiple visual domains with residual adapters(附翻译)
  6. 豆瓣高分推荐:提升管理力,怎么能不看这6本书
  7. Android开发基础规范(二)
  8. verilog 实现32位加法器(超前进位)
  9. 怎么让联想计算机升级,如何将Win7、Win8升级至Windows 10系统
  10. 竖直的ViewPager,上下滑动的ViewPager,VerticalViewPager ;