[Análisis del proyecto RuoYi] Presentamos los filtros de la puerta de enlace RuoYi


Este artículo presenta principalmente los filtros utilizados en RuoYi, así como un análisis simple del principio del filtro. Para conocer los principios detallados de Spring Gateway, consulte los otros artículos del autor.

1. Lista de filtros de puerta de enlace

En el "Módulo Gateway" se definen un total de 5 filtros. La clasificación es la siguiente:

  • Hereda AbstractGatewayFilterFactory
    • ValidateCodeFilter (filtro de código de verificación)
    • BlackListUrlFilter (filtro de lista negra)
    • Filtro de solicitud de caché
  • Implementar GlobalFilter, interfaz ordenada
    • XssFilter (filtro de secuencias de comandos entre sitios)
    • AuthFilter (autenticación de puerta de enlace)

2. Principios de GatewayFilterFactory y GlobalFilter

Hay varias cuestiones que es necesario resolver:

  • ¿Cuáles son las diferencias entre los filtros que heredan la clase AbstractGatewayFilterFactory e implementan las interfaces GlobalFilter y Ordered?

Referencia de GlobalFilter: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-combined-global-filter-and-gatewayfilter-ordering
Referencia de GatewayFilterFactory: https://docs. spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
La clave es: GlobalFilter apunta a " todas las rutas ", mientras que GatewayFilterFactory apunta a " rutas específicas "

  • ¿Por qué implementar la interfaz ordenada de Spring?

Para controlar el orden de los filtros, la interfaz Ordered de Spring ordena en orden ascendente según el valor del pedido.

  • Hay implementación de herencia e interfaz, ¿cuál es su orden?
public Mono<Void> handle(ServerWebExchange exchange) {
    
    
    Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
    List<GatewayFilter> gatewayFilters = route.getFilters();

    List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
    combined.addAll(gatewayFilters);
    // TODO: needed or cached?
    AnnotationAwareOrderComparator.sort(combined);

    if (logger.isDebugEnabled()) {
    
    
        logger.debug("Sorted gatewayFilterFactories: " + combined);
    }

    return new DefaultGatewayFilterChain(combined).filter(exchange);
}

De la combinación anterior, podemos ver que el filtro gatewayLos filtros de la ruta específica se obtienen primero del atributo de solicitud, luego se combinan con el filtro global y finalmente se ordenan por Ordenado. Sin embargo, heredar GatewayFilterFactory no especifica el valor del pedido. Solo se implementa la interfaz Ordered para especificar el valor del pedido. ¿Cómo lidiar con GatewayFilterFactory en este momento? Adivina: ¿Está relacionado con el
orden de los filtros configurados en la ruta de la puerta de enlace de nacos ? ?

3. Cómo configurar el archivo de configuración de la puerta de enlace RuoYi

En el archivo de configuración de la puerta de enlace de nacos ruoyi-gateway-dev.yml, se configuran varios filtros más para el módulo ruoyi-auth.

spring:
  redis:
    host: localhost
    port: 6379
    password:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        # 认证中心
        - id: ruoyi-auth
          uri: lb://ruoyi-auth
          predicates:
            - Path=/auth/**
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1
        # 代码生成
        - id: ruoyi-gen
          uri: lb://ruoyi-gen
          predicates:
            - Path=/code/**
          filters:
            - StripPrefix=1
        # 定时任务
        - id: ruoyi-job
          uri: lb://ruoyi-job
          predicates:
            - Path=/schedule/**
          filters:
            - StripPrefix=1
        # 系统模块
        - id: ruoyi-system
          uri: lb://ruoyi-system
          predicates:
            - Path=/system/**
          filters:
            - StripPrefix=1
        # 文件服务
        - id: ruoyi-file
          uri: lb://ruoyi-file
          predicates:
            - Path=/file/**
          filters:
            - StripPrefix=1

# 安全配置
security:
  # 验证码
  captcha:
    enabled: true
    type: math
  # 防止XSS攻击
  xss:
    enabled: true
    excludeUrls:
      - /system/notice
  # 不校验白名单
  ignore:
    whites:
      - /auth/logout
      - /auth/login
      - /auth/register
      - /*/v2/api-docs
      - /csrf

Entre ellos, CacheRequestFilter y ValidateCodeFilter están configurados especialmente para el módulo Auth . Otros módulos utilizan filtros XssFilter y AuthFilter globalmente

4. Referencia de información

Dirección de notas de Yuque: https://www.yuque.com/yuchangyuan/tkb5br

Supongo que te gusta

Origin blog.csdn.net/yuchangyuan5237/article/details/133473123
Recomendado
Clasificación