Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Ribbon拦截器ClientHttpRequestInterceptor-传递header

Ribbon拦截器ClientHttpRequestInterceptor-传递header

作者头像
yingzi_code
发布于 2020-03-20 03:19:09
发布于 2020-03-20 03:19:09
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

Ribbon拦截器ClientHttpRequestInterceptor-传递header

Spring Cloud的微服务在使用RestTemplate调用的时候,header会丢失,这会导致服务间token等一些信息的丢失

可以使用ClientHttpRequestInterceptor拦截请求,并将header统一设置进去

首先配置一个自定义的ClientHttpRequestInterceptor

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Component
public class MyRibbonInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

        log.info("===request: {}, {}", request.getURI().getHost(), request.getURI().getPath());
        request.getHeaders().set("aaa", "aaa");
        return execution.execute(request, body);
    }
}

在启动程序的时候将这个拦截器注入所有的RestTemplate的Bean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setInterceptors(Collections.singletonList(myRibbonInterceptor));
        return restTemplate;
    }

也可以通过程序启动的时候拦截所有的RestTemplate的bean来对所有RestTemplate全局注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void setRestTemplateInterceptors(){
        Map<String, RestTemplate> map = applicationContext.getBeansOfType(RestTemplate.class);
        map.keySet().forEach(key -> {
            RestTemplate restTemplate = map.get(key);
            List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
            list.add(myRibbonInterceptor);
            restTemplate.setInterceptors(list);
        });
    }

写一个controller来测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping("/ribbon")
    public String ribbon(@RequestParam String param) {
        return restTemplate.getForObject("http://SPRING-CLOUD-CLIENT-DEMO/demo/get?param="+param, String.class);
    }

启动程序测试

查看程序打印, 可以看到进入了自定义的MyRibbonInterceptor

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 INFO 31884 --- [ctor-http-nio-3] c.m.d.g.interceptor.MyRibbonInterceptor  : ===request: SPRING-CLOUD-CLIENT-DEMO, /demo/get

查看restTemplate调用的服务打印

设置的header成功传递

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Feign的拦截器RequestInterceptor
SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求
yingzi_code
2020/03/18
31.7K3
SpringCloudGateway笔记(8)-权重
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
1.7K0
【一起学源码-微服务】Ribbon 源码一:Ribbon概念理解及Demo调试
前面文章已经梳理清楚了Eureka相关的概念及源码,接下来开始研究下Ribbon的实现原理。
一枝花算不算浪漫
2020/01/14
7450
【一起学源码-微服务】Ribbon 源码一:Ribbon概念理解及Demo调试
SpringCloudGateway笔记(2)-filter与自定义filter
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.1K0
Ribbon分析
调用时,直接使用在eureka中注册的服务名进行调用,就可以由ribbon来进行负载均衡了
zhaozhen
2021/07/13
3730
聊聊spring cloud的LoadBalancerAutoConfiguration
本文主要研究一下spring cloud的LoadBalancerAutoConfiguration
code4it
2018/09/17
1.1K0
SpringCloudGateway笔记(9)-限流
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.3K0
为何一个@LoadBalanced注解就能让RestTemplate拥有负载均衡的能力?【享学Spring Cloud】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/09/18
1.7K0
ribbon源码
这里通过@LoadBalance注解, 引入了ribbon, 自动实现ribbon的负载均衡策略
用户7798898
2020/09/27
6590
ribbon源码
Spring Cloud系列二:Ribbon
在微服务环境下每个服务实例少则几个,多则上百个,如何让请求均匀分布到各服务实例上是微服务架构下必须解决的一个问题,这方面有2种解决方案:
心平气和
2021/02/26
3800
微服务组件【负载均衡】Netflix Ribbon
Netflix Ribbon是一个客户端负载均衡组件,用于将用户请求根据负载均衡算法负载到后端不同的服务集群节点上,从而降低单点服务器压力。
默 语
2024/11/22
920
Spring Cloud微服务技术栈(五):客户端负载均衡Spring Cloud Ribbon部分源码分析
为了使客户端具备负载均衡的能力,我们在代码中将RestTemplate交给Spring管理的时候,会加上@LoadBalanced注解,如下代码所示:
itlemon
2020/04/03
6970
Spring Cloud微服务技术栈(五):客户端负载均衡Spring Cloud Ribbon部分源码分析
SpringCloud Nacos + Ribbon 调用服务的 2 种方法!
在 Nacos 中,服务调用主要是通过 RestTemplate + Ribbon 实现的,RestTemplate 是 Spring 提供的 Restful 请求实现类,而 Ribbon 是客户端负载均衡器,通过 Ribbon 可以获取服务实例的具体信息(IP 和端口号),之后再通过 RestTemplate 加服务实例的具体信息就可以完成一次服务调用了。 ​
磊哥
2022/05/10
2.4K0
SpringCloud Nacos + Ribbon 调用服务的 2 种方法!
2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」
鹿老师的Java笔记
2021/01/14
2K0
面试官:说说Ribbon是如何实现负载均衡的?
Ribbon的作用是负载均衡,但是根据我面试他人的情况来看,很多人只忙于业务,而不清楚具体的底层原理,在面试中是很容易吃亏的。基于此,本文就来分析一下这里面的请求流程,里面贴的源码会比较多,如果看不惯的话,可以直接看最后的总结。
业余草
2020/09/18
1.8K0
RestTemplate的逆袭之路,从发送请求到负载均衡
上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求的工具吗?它什么时候具有了实现客户端负载
江南一点雨
2018/04/02
3.3K0
RestTemplate的逆袭之路,从发送请求到负载均衡
Spring Cloud 快速上手之 Ribbon 负载均衡
Spring Cloud Ribbon是基于HTTP和TCP的客户端负载工具,它是基于Netflix Ribbon实现的。通过Spring Cloud的封装,可以轻松地将面向服务的REST 模板请求,自动转换成客户端负载均衡服务调用。提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。
架构探险之道
2020/05/17
7690
SpringCloud @LoadBalanced 负载均衡原理
一个是spring-cloud-common里面的org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;另外一个是 spring-cloud-loadbalancer里面的org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration。
用户3293499
2024/12/22
1340
SpringCloudRibbon负载均衡实现原理
在SpringCloud中,我们最常使用到的负载均衡库就是ribbon。使用方式,一般是通过自动配置类注入,然后在类中定义负载均衡实例bean
tunsuy
2022/10/27
3360
Spring RestTemplate进阶:拦截器
在这篇文章中,我们将学习如何实现一个Spring RestTemplate 拦截器。
烟雨平生
2023/03/07
3.1K0
Spring RestTemplate进阶:拦截器
推荐阅读
相关推荐
Feign的拦截器RequestInterceptor
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验