Spring项目中Ordered接口的应用之全局过滤器(GlobalFilter)的顺序控制

 更新时间:2024年06月04日 09:38:36   作者:好奇的菜鸟  
在Spring框架,尤其是Spring Cloud Gateway或Spring WebFlux项目中,Ordered接口扮演着重要的角色,特别是在实现全局过滤器(GlobalFilter)时,用于控制过滤器执行的优先级,下面将介绍如何在Spring项目中使用Ordered接口来管理Global Filter的执行顺序,需要的朋友可以参考下

在Spring框架,尤其是Spring Cloud Gateway或Spring WebFlux项目中,Ordered接口扮演着重要的角色,特别是在实现全局过滤器(GlobalFilter)时,用于控制过滤器执行的优先级。下面将介绍如何在Spring项目中使用Ordered接口来管理Global Filter的执行顺序。

Ordered接口简介

Ordered接口位于org.springframework.core包下,定义了单一方法getOrder(),用于返回一个整数值来表明组件的排序优先级。该接口有两个静态常量:

  • HIGHEST_PRECEDENCE:设置最高优先级,值为Integer.MIN_VALUE
  • LOWEST_PRECEDENCE:设置最低优先级,值为Integer.MAX_VALUE

全局过滤器(GlobalFilter)与Ordered

GlobalFilter介绍

在Spring Cloud Gateway或WebFlux应用中,GlobalFilter是一种可以对所有进入网关的请求或从网关出去的响应进行拦截处理的机制。它们允许开发者实现跨切割点的逻辑,如鉴权、日志记录、请求改写等。

控制执行顺序

为了确保过滤器按照预期的顺序执行,实现Ordered接口变得尤为重要。不同的过滤器可能依赖于其他过滤器的操作结果,或者有特定的执行要求,通过实现getOrder()方法返回不同的优先级值,可以精确控制过滤器链中的执行顺序。

实现示例

假设我们要创建一个简单的日志记录过滤器和一个鉴权过滤器,并且希望鉴权操作发生在日志记录之前,我们可以这样做:

// 导入必要的包
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<Object> implements Ordered {
    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            // 在此处实现日志记录逻辑
            System.out.println("Logging before request...");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> 
                System.out.println("Logging after response..."))); 
        };
    }
    @Override
    public int getOrder() {
        // 设置此过滤器的执行优先级,数值越大,执行越晚
        return -10;
    }
}
@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在此处实现鉴权逻辑
        System.out.println("Authenticating request...");
        // 假设鉴权通过,继续处理请求
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        // 设置此过滤器的执行优先级,数值越小,执行越早
        return -20;
    }
}

说明

  • LoggingFilter实现了日志记录功能,并通过getOrder()方法设置了较低的优先级,意味着它将在大多数其他过滤器之后执行。
  • AuthFilter负责鉴权逻辑,通过实现Ordered接口并返回较高的优先级值,确保其在日志记录之前执行。

通过这种方式,开发者可以精确地控制不同Global Filter的执行顺序,以满足应用的具体需求。

到此这篇关于Spring项目中Ordered接口的应用之全局过滤器(GlobalFilter)的顺序控制的文章就介绍到这了,更多相关Spring Ordered接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot异常日志输出方式

    Springboot异常日志输出方式

    这篇文章主要介绍了Springboot异常日志输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Intellij idea热部署插件JRebel的使用

    Intellij idea热部署插件JRebel的使用

    这篇文章主要介绍了Intellij idea热部署插件JRebel的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java动态代理详解

    java动态代理详解

    本文章要用很土的语言描述Java动态代理,力求更易被理解。Java是JDK5中新加的机制,大家都知道Spring是用Java的动态代理实现的,那这个动态代理是什么东东呢,首先他肯定是个代理,我们先讲代理,把代理弄明白了,动态代理就好说了
    2014-02-02
  • Java超详细讲解继承和多态的使用

    Java超详细讲解继承和多态的使用

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-05-05
  • 浅谈一下maven优缺点及使用和特点

    浅谈一下maven优缺点及使用和特点

    这篇文章主要介绍了浅谈一下maven优缺点及使用和特点,一个项目管理工具软件,那么maven项目有什么优缺点呢,让我们一起来看看吧
    2023-03-03
  • Java如何执行cmd命令

    Java如何执行cmd命令

    这篇文章主要介绍了Java如何执行cmd命令问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Javaweb-HttpServletResponse的sendRedirectch重定向方式

    Javaweb-HttpServletResponse的sendRedirectch重定向方式

    这篇文章主要介绍了Javaweb-HttpServletResponse的sendRedirectch重定向方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 解析SpringBoot中@Autowire注解的实现原理

    解析SpringBoot中@Autowire注解的实现原理

    在开发Java项目时,依赖注入是一种常见的实现方式,SpringBoot框架通过@Autowired注解来实现依赖注入的功能,本文将介绍SpringBoot中 Autowired注解实现的原理
    2023-06-06
  • 如何更优雅地获取spring boot yml中的值

    如何更优雅地获取spring boot yml中的值

    这篇文章主要给大家介绍了关于如何更优雅地获取spring boot yml中值的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Java 线程死锁的问题解决办法

    Java 线程死锁的问题解决办法

    这篇文章主要介绍了 Java 线程死锁的问题解决办法的相关资料,希望通过本大家能帮助到大家,遇到类似问题能够解决,需要的朋友可以参考下
    2017-09-09

最新评论