Directorio de artículos
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