Java 是否有方法在路由之前应用过滤器或代码(SpringCloudGateway)
我正在编写一个API网关,它必须根据MAC地址路由请求。端点示例:Java 是否有方法在路由之前应用过滤器或代码(SpringCloudGateway),java,spring,api-gateway,spring-cloud-gateway,Java,Spring,Api Gateway,Spring Cloud Gateway,我正在编写一个API网关,它必须根据MAC地址路由请求。端点示例: /api/v2/device/AABBCCDDEEFF /api/v2/device/AABBCCDDEEFF/metadata /api/v2/device/search?deviceId=AABBCCDDEEFF 我已经编写了一个程序来提取MAC地址,执行必要的逻辑来确定MAC地址应该路由到哪个URL,然后将该信息存储在ServerWebExchange属性中 公共类CustomRoutePredicateFactory扩
/api/v2/device/AABBCCDDEEFF
/api/v2/device/AABBCCDDEEFF/metadata
/api/v2/device/search?deviceId=AABBCCDDEEFF
我已经编写了一个程序来提取MAC地址,执行必要的逻辑来确定MAC地址应该路由到哪个URL,然后将该信息存储在ServerWebExchange
属性中
公共类CustomRoutePredicateFactory扩展了AbstractRoutePredicateFactory{
//省略字段/构造函数
私有静态最终字符串IP_ATTRIBUTE=“assignedIp”;
私有静态最终字符串MAC_ATTRIBUTE=“MAC”;
@凌驾
公共谓词应用(配置){
返回(ServerWebExchange)->{
字符串mac=exchange.getAttributes().get(mac_属性);
如果(mac==null){
mac=提取mac地址(交换);
}
如果(!exchange.getAttributes().包含(IP_属性)){
exchange.getAttributes().put(IP_属性,findAssignedIp(mac);
}
返回config.getRouteIp().equals(exchange.getAttribute(IP_属性));
});
}
//省略Config类和实用程序方法
}
注意:为了简洁起见,此实现大大简化
通过这个实现,我能够保证MAC只提取一次,而确定请求所属URL的逻辑只执行一次。对谓词工厂的第一次调用将提取并设置有关ServerWebExchange属性的信息,对谓词工厂的任何进一步调用将检测这些属性并使用它们确定它们是否匹配
这是可行的,但不是特别整洁。如果我能在应用程序尝试匹配路由之前,以某种方式设置进入网关的每个请求的Exchange属性,那就简单多了。然后,过滤器可以是一个简单的谓词,用于检查交换属性是否相等
我已经把文档读了好几遍,但似乎什么都不可能。筛选器始终限定在特定路由的范围内,并且仅在路由匹配后运行。可以将第一个路由设置为另一个谓词,该谓词执行必要的代码,设置预期的属性并始终返回false,但是我可以保证该谓词是始终运行第一个?似乎应该有对这种用例的支持,但我一生都找不到一种不象黑客的方法。有什么想法吗?我认为您的方法很有意义,因为您希望它在过滤器之前运行 您是否考虑过使用带有订单设置的
GlobalFilter
?您可以确保它始终是要运行的第一个筛选器。您还可以修改ServerWebExchange
中的URL,方法是更改请求并在exchange上设置GATEWAY\u request\u URL\u ATTR
属性
查看PrefixPathGatewayFilterFactory
,了解如何更改路由到的URI的示例
通过实现org.springframework.core.Ordered
接口,可以在全局过滤器上设置顺序
尽管如此,它仍然感觉有点像黑客,但它是一种替代方法。我认为您的方法是有意义的,因为您希望它在过滤器之前运行 您是否考虑过使用带有订单设置的
GlobalFilter
?您可以确保它始终是要运行的第一个筛选器。您还可以修改ServerWebExchange
中的URL,方法是更改请求并在exchange上设置GATEWAY\u request\u URL\u ATTR
属性
查看PrefixPathGatewayFilterFactory
,了解如何更改路由到的URI的示例
通过实现org.springframework.core.Ordered
接口,可以在全局过滤器上设置顺序
尽管如此,它仍然感觉有点像黑客,但它是一种替代方法。我认为它可能会帮助您重写类RoutePredicateHandlerMapping。
请参阅:
org.springframework.web.reactive.handler.AbstractHandlerMapping#getHandler
我认为重写类RoutePredicateHandlerMapping可能会有所帮助。
请参阅:
org.springframework.web.reactive.handler.AbstractHandlerMapping#getHandler
您是否考虑过将您提到的类链接到各自的Javadoc?您是否考虑过将您提到的类链接到各自的Javadoc?