当前位置: 首页 > 知识库问答 >
问题:

有没有办法在路由之前应用一个过滤器或代码(Spring Cloud Gateway)

秦哲瀚
2023-03-14
/api/v2/device/AABBCCDDEEFF
/api/v2/device/AABBCCDDEEFF/metadata
/api/v2/device/search?deviceId=AABBCCDDEEFF
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {
    // Fields/Constructors Omitted

    private static final String IP_ATTRIBUTE = "assignedIp";
    private static final String MAC_ATTRIBUTE = "mac";

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return (ServerWebExchange exchange) -> {
            String mac = exchange.getAttributes().get(MAC_ATTRIBUTE);
            if(mac == null){
                mac = extractMacAddress(exchange);
            }

            if(!exchange.getAttributes().contains(IP_ATTRIBUTE)){
                exchange.getAttributes().put(IP_ATTRIBUTE, findAssignedIp(mac);
            }

            return config.getRouteIp().equals(exchange.getAttribute(IP_ATTRIBUTE));
        });
    }
    // Config Class & utility methods omitted
}

这是可行的,但它不是特别整齐。如果我能在应用程序尝试匹配路由之前,以某种方式对进入网关的每个请求设置Exchange属性,将会容易得多,也会简单得多。则筛选器可以是一个简单的谓词,用于检查Exchange属性是否相等。

我已经把文档读了好几遍,但似乎什么都不可能。筛选器的作用域总是特定的路由,并且仅在路由匹配后才运行。也许可以让第一个路由是另一个谓词,它执行必要的代码,设置预期的属性,并且总是返回false,但是我能保证这个谓词总是首先运行吗?似乎应该支持这种用例,但我找不到一种看起来不像黑客的方法。有什么想法吗?

共有1个答案

养星汉
2023-03-14

我认为您的方法是有意义的,因为您希望它在过滤器之前运行。

您是否考虑过使用带有订单集的globalfilter?您可以确保它始终是第一个运行的筛选器。您还可以修改ServerWebExchange中的URL,方法是更改请求并在Exchange上设置GATEWAY_REQUEST_URL_ATTR属性。

查看PrefixPathGatewayFilterFactory以获得如何更改路由到的URI的示例。

您可以通过实现org.springframework.core.ordered接口在全局筛选器上设置顺序。

话虽如此,它仍然感觉有点像一个黑客,但它是一个替代的方法。

 类似资料:
  • 我一直试图找到一个简单的解决办法。 我有一个显示项目列表的for循环。单击其中一个项目会将您转到详细组件,我只希望所选项目在详细组件中可用。出于某种原因,没有简单的解决方案(据我所知)。我希望会有这样的事情: `` 这就是我想要的。但是,这当然行不通。 我错过什么了吗?

  • 是否可以跳过文档中的第一个记录的名称例如product_detail是集合,它有10个文件的名称苹果和10个文件的名称芒果我可以跳过前2个文件中的每一个?下面的查询跳过苹果中的前2个文档。 不要用两个查询跳过“productInfo.name”:“apple”和“productInfo.name”:“mango”的两个文档,我需要一个,有人能帮我吗?

  • 想实现先请求接口然后再生成路由改如何做到?(下面代码试了几次都不行)

  • 我的任务是为Youtrack构建一个自定义界面,并且正在使用新的Youtrack API-docs:https://www.jetbrains.com/help/Youtrack/standalone/youtrack-rest-api-reference.html。我正在查询一个完整的问题列表,返回1.17MB的数据。问题是这需要一段时间,并且我只需要特定字段的问题,即和。 有没有一种方法可以用

  • 我有一个过滤器和一个Servlet。我试图创建一个Cookie,并将其添加到“chain.do过滤器”方法后的过滤器中的响应中。 *Cookie需要在"chain.do过滤器"方法之后创建并添加到响应中,因为它的值取决于来自响应的一些信息。 我做了一些研究,发现为响应创建一个包装器(在doFilter方法之前)将允许我实现这一点,但它不起作用,我可以将Cookie添加到包装器中,但在浏览器中检查时

  • 我有一个需求,我想找到运行的jar中的jar的路径。假设有一个名为example-1.0.0.jar的罐子在一个名为main-1.0.0.jar.的运行罐子里,我想知道运行罐子里存在的罐子的路径。 编辑1:例如,jar是项目中的一个依赖项。例如,假设我的项目中有一个log4j依赖项,我想知道log4j jar在类中的路径。我怎样才能找到路?