SpringCloudGateway框架下的http请求头部自定义实践

这篇具有很好参考价值的文章主要介绍了SpringCloudGateway框架下的http请求头部自定义实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringCloud-Gateway的请求头部自定义实践

在微服务框架中,SpringCloud-Gateway的方式几乎是首选。也得益于Reactor的实现,使得SpringCloud-Gateway的性能在所有的网关平台中脱颖而出。在一次项目实践中,需要自定义请求的头部信息,故来了一趟学习之旅。
一个请求在网关中的执行顺序是经过一系列的过滤器链进行链式调用并执行的。SpringCloud-Gateway中的过滤器又分为全局过滤器(GlobalFilter)和网关过滤器(XXXGatewayFilterFactory)又称路由过滤器,对于链式调用过滤器执行顺序见下图:
gateway 请求头,Programming,spring cloud,gateway,java,httpgateway 请求头,Programming,spring cloud,gateway,java,http

上图列出了SpringCloud-Gateway中框架带的过滤器及其优先级,其值越小,优先级越高。全局过滤器位置比较灵活,通过控制优先级,可以指定具体的执行顺序;但是,网关过滤器的执行顺序是有限制的,它的优先级范围在大于0且小于10150(这个版本依赖于框架版本,该值出自spring-cloud-starter-gateway-3.1.3),就算程序中优先级强制指定其他范围,也不会生效。注意,框架自带的过滤器的优先级也改变不了,或者不能被覆盖,强行指定优先级也会不生效的。另外,过滤器分为前置过滤和后置过滤,像拦截器中的Interceptor中的preHandle和postHandle,只不过写法不一样,因为SpringCloud-Gateway使用的reactor模式,有点模糊的小可爱,可以去了解了解。

上面学习了SpringCloud-Gateway的优先级后,来解决实际的问题。
抛出问题:目的是需要自定义请求的头部信息,只能返回指定的头部才能正确解析相关请求(用于和硬件终端通信),在经过SpringCloud-Gateway框架后,一个请求的头部带了很多额外信息,导致终端数据接受的时候解析失败。
问题发现:通过断点调试后,发现多了很多头部信息,一部分是网关整合了SpringSecurity,在经过过滤器链式调用后增加了很多额外头部,另一部分则来自http请求的,如Keep-Alive和Connection。
问题解决:首先是利用断点方式,发现都是调用了_NettyWriteResponseFilter_(优先级为-1)这个全局过滤器的后置方法后才添加的头部信息,因此使用路由过滤器是完成不了的,因为路由过滤器作用域小于全局过滤器的,作用范围更小。故需要实现全局过滤器去处理增加的头部,代码如下:

@Slf4j
@Component
public class CustomHeaderGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).doFirst(() -> {
            if (exchange.getRequest().getPath().value().contains(xxx)) {
                exchange.getResponse().beforeCommit(() -> Mono.fromRunnable(() -> {
                    HttpHeaders headers = exchange.getResponse().getHeaders();
                    headers.remove("Cache-Control");
                    headers.remove("Pragma");
                    headers.remove("Expires");
                    headers.remove("X-Content-Type-Options");
                    headers.remove("X-Frame-Options");
                    headers.remove("X-XSS-Protection");
                    headers.remove("Referrer-Policy");
                }));
            }
        });
    }

    /**
     * 指定在网关过滤器中的顺序,-100的优先级在NettyWriteResponseFilter前面,使得前置过滤在其之前执行,在其后置过滤之后执行(详细见springCloud过滤器规则)
     * @return 顺序
     */
    @Override
    public int getOrder() {
        return -100;
    }

}

在上述代码中,值得注意的是去掉不需要的头部信息,也不是直接操作某个请求的HttpHeader,因为HttpHeader对应一个请求,每个请求它有自己管理头部信息的一个过程,只有在允许的操作过程中,才能对其修改。
gateway 请求头,Programming,spring cloud,gateway,java,http
上图中每个请求会对应四种阶段,在COMMITTED状态以后,是不允许进行编辑操作的,但可以查看
gateway 请求头,Programming,spring cloud,gateway,java,http
可以清晰看出在COMMITTED状态以后拿到的就是不可编辑的Header,是不允许对其写操作的
gateway 请求头,Programming,spring cloud,gateway,java,http
上图是应用COMMITTED的一个时机,所以结合我们的需求,就必须在COMMITTED状态应用之前完成自定义的头部处理,但是手动控制这个自定义的时机,还是非常困难的,你不确定这个doCommit()方法在什么时候调用,但是源码中是给我们提供了一个方法
gateway 请求头,Programming,spring cloud,gateway,java,http
在doCommit()这个方法中我们也看到了对commitActions这个容器进行了调用和处理,所以只要我们提前添加需要对Header处理的逻辑并放到这个容器中,那么在请求的整个处理过程中就会把我们的操作编织进去,从而就完成了我们自定义的一些操作。文章来源地址https://www.toymoban.com/news/detail-699514.html

到了这里,关于SpringCloudGateway框架下的http请求头部自定义实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++使用HTTP库和框架轻松发送HTTP请求

    使用C++编程发送HTTP请求通常需要使用第三方的HTTP库或框架。在C++中,有几个受欢迎的HTTP库可供选择,例如Curl、Boost.Beast和cpp-httplib。另外,也可以自己实现socket来发送http请求。 (1)安装Curl库 。 对于Debian/Ubuntu系统: 对于RHEL/CentOS系统: 对于macOS系统: (2)编写Curl代码

    2024年02月02日
    浏览(45)
  • SpringCloudGateway--过滤器(自定义filter)

    目录 一、概览  二、全局过滤器GlobalFilter 三、通过GatewayFilter实现 四、继承AbstractGatewayFilterFactory        当使用Spring Cloud Gateway构建API网关时,可以利用Spring Cloud Gateway提供的内置过滤器(filter)来实现对请求的处理和响应的处理。过滤器可以在请求被路由之前或之后被执

    2024年02月06日
    浏览(38)
  • 基于Gin框架的HTTP接口限速实践

    在当今的微服务架构和RESTful API主导的时代,HTTP接口在各个业务模块之间扮演着重要的角色。随着业务规模的不断扩大,接口的访问频率和负载也随之增加。为了确保系统的稳定性和性能,接口限速成了一个重要的话题。 1 接口限速的使用场景 接口限速的使用场景主要涉及以

    2024年02月10日
    浏览(33)
  • SpringCloudGateway过滤器(全局认证、IP拦截、请求参数过滤、响应参数过滤)

    全局过滤器(认证) IP网关过滤器 请求参数网关过滤器

    2024年02月14日
    浏览(40)
  • 【NanoHTTPD】Android,使用NanoHTTPD搭建服务器,接受Http请求,最佳实践

    安卓app,作为服务器,接受Http,get post 请求推送数据,NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。 开源地址:GitHub - NanoHttpd/nanohttpd: Tiny, easily embeddable HTTP serv

    2024年02月10日
    浏览(44)
  • 若依框架下的自定义Exception抛出,返回code,msg不出错(spring boot)。

    若依框架下的自定义Exception抛出,返回code,msg不出错: 最近接的项目后台中,因为需要在app用到自定义的token验证(不用若依的那一套登陆token)来确保接口的安全性,需要在进入接口前使用aop切面的before来验证它的头(headers)是否符合条件。 先上代码: 当token出现不匹配

    2023年04月09日
    浏览(56)
  • 关于MSMQ(System.Messaging.MessageQueue)安装及在.NET Framework框架下的简单应用实现,以解决大并发请求问题

    提示:大并发请求队列处理及实时聊天消息也可参考本文自行实现 随着大数据的不断发展,我们实际开发的项目也开始逐渐接触到大数据大并发造成的一些问题,由于近期项目需求要满足2000并发量,经过压测发现原项目中编写的正常逻辑读写程序很卡顿,服务器环境Windows

    2024年02月06日
    浏览(63)
  • Python向带有SSL/TSL认证服务器发送网络请求小实践(附并发http请求实现asyncio+aiohttp)

    最近工作中遇到这样的一个场景:给客户发送文件的时候,为保证整个过程中,文件不会被篡改,需要在发送文件之间, 对发送的文件进行签名, 而整个签名系统是另外一个团队做的, 提供了一个接口服务完成签名,但访问这个接口需要提供他们团队提供的证书链先进行认

    2024年04月16日
    浏览(43)
  • SpringCloud Alibaba - HTTP 客户端 OpenFeign 、自定义配置、优化、最佳实践

    目录 一、OpenFeign 是什么,有什么用呢? 二、OpenFeign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能 3.编写 OpenFeign 客户端 4.通过 OpenFeign 客户端发起远程调用 2.2、自定义 OpenFeign 配置 1.配置文件方式 2.j

    2024年02月08日
    浏览(48)
  • Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

    目录 一、OpenFeign 是什么,有什么用呢? 二、OpenFeign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能 3.编写 OpenFeign 客户端 4.通过 OpenFeign 客户端发起远程调用 2.2、自定义 OpenFeign 配置 1.配置文件方式 2.j

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包