微服务如何通过feign.RequestInterceptor传递参数
作者:冲奶粉的奶爸 发布时间:2022-02-26 00:28:20
微服务通过feign.RequestInterceptor传递参数
Feign 支持请求 * ,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求 * 需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参数 template ,该参数类型为 RequestTemplate,我们可以根据实际情况对请求信息进行调整,示例如下:
创建自定义请求 *
在发送请求前增加了一个请求头信息,进行身份校验。
import feign.RequestInterceptor;
import feign.RequestTemplate;
public class MyRequestInterceptor implements RequestInterceptor{
public void apply(RequestTemplatetemplate){
template.header("Authorization","123");
}
}
服务端可以通过HttpServletRequest获取到前面传递的参数
具体获取逻辑如下
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
request.getHeader("Authorization");
}
feign的 * RequestInterceptor
SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求
首先创建自定义的RequestInterceptor
这里通过RequestContextHolder获取到当前的request
@Slf4j
@Component
public class MyFeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
log.info("===request: {}", template.url());
template.header("aaaa", "bbbb");
}
}
然后定义一个feign的接口类
@FeignClient(name = "SPRING-CLOUD-CLIENT-DEMO")
public interface ClientFeign {
@GetMapping("/demo/get")
String weight(@RequestParam String param);
}
再创建一个controller
@Slf4j
@RestController
@RequestMapping("/interceptor")
public class InterceptorController {
@Autowired
private ClientFeign clientFeign;
@GetMapping("/feign")
public String feign(@RequestParam String param) {
return clientFeign.weight(param);
}
}
运行程序测试一下接口
查看程序打印
可以看到进入了我们自定义的RequestInterceptor
INFO 25936 --- [ctor-http-nio-3] c.m.d.g.interceptor.MyFeignInterceptor : ===request: /demo/weight?param=a
再查看feign调用的程序日志,可以看到设置的header信息
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : aaaa: a
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : websession: ECF4D97D02EEAFDDA3C15A7F1F050F61
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: aaaa, bbbb
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: accept, */*
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: user-agent, Java/1.8.0_191
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: host, 39.108.15.147:8801
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: connection, keep-alive
来源:https://blog.csdn.net/qq_32258777/article/details/102837238
猜你喜欢
- mysql实现配置中心本公司配置数据的管理是通过mysql进行配置管理,因为已经搭建好了,所以自己动手重新搭建一遍,熟悉整个流程。有关项目源
- 目录前言1.设计模式:单例模式1.1 使用时分配,1.2 声明时实例化1.3 双检锁1.4 .net 特性保证的线程安全1.5 使用DI依赖
- CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout
- 文件上传在Web应用中非常普遍,要在Java Web环境中实现文件上传功能非常容易,因为网上已经有许多用Java开发的组件用于文件上传,本文
- 一、项目简述功能包括(管理员和学生角色): 管理员和学生登录,图书管理,图书添加删除修改,图书 借阅,图书归还,图书查看,学生管理,借还管理
- 如下所示:import java.security.MessageDigest;import java.security.NoSuchAlg
- 这篇文章主要介绍了Java Collection集合iterator方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- shrio是一个比较轻量级的安全框架,主要的作用是在后端承担认证和授权的工作。今天就讲一下shrio进行认证的一个过程。首先先介绍一下在认证
- 目录1、简介2、访问修饰符3、原则总结1、简介访问修饰符是Java语法中很基础的一部分,但是能正确的使用Java访问修饰符的程序员只在少数。
- 项目演示演示中只用一个用户登录,只是为了测试功能,实际使用中是根据数据库表内数据来决定的。1 创建工程完成配置1 ieda新建maven项目
- 如果我们在Intellij Idea中开发好程序,需要部署到远程SSH服务器运行,我们可以使用某些SSH软件的rz功能,也可以使用专用的FT
- ASP.NET MVC中进行分页的方式有多种,但在NuGet上使用最广泛的就是用PagedList、X.PagedList.Mvc进行分页。
- springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jd
- 本文实例讲述了C#实现简单的Login窗口。分享给大家供大家参考。具体实现方法如下:C# 制作登录窗体,登录成功之后正确的做法是关闭(clo
- 首先声明一点,这里的重试并不是报错以后的重试,而是负载均衡客户端发现远程请求实例不可到达后,去重试其他实例。@Bean@LoadBalanc
- Spring Data Jpa复杂查询总结只是做一个总结所以就不多说废话了实体类@Entity@Table(name = "t_h
- 分转元private String fenToYuan(String amount){ NumberFormat format
- 本文实例为大家分享了java日期时间基本操作方法,供大家参考,具体内容如下1. 获得Calendar实例:Calendar c = Cale
- 本文实例为大家分享了Spring实现默认标签解析流程的具体代码,供大家参考,具体内容如下承接上文,进入parseBeanDefinition
- 1.前言任何系统,我们不会傻傻的在每一个地方进行异常捕获和处理,整个系统一般我们会在一个的地方统一进行异常处理,spring boot全局异