9

我正在尝试制作与以下 URL 匹配的过滤器:

/foo/foo/*

所以下面/foo/的任何东西以及基本情况/foo

我有这个过滤器:

    Spark.before("/foo/*", (request, response) -> {
        String ticket = request.cookie("session");
        if (ticket == null) {
            Spark.halt(302);
        }
    });

但是,当我进入时,这当然不会执行/foo

我尝试了以下但没有运气:

/foo* /foo.* /foo/

有没有办法做到这一点?或者也许使用 URL 列表?这样我就可以将两个 url 分配给同一个过滤器。

并且请不要说将函数存储在变量中,以便我使用它两次,因为我认为这根本不干净..

4

1 回答 1

7

根据https://github.com/perwendel/spark/blob/1ecd428c8e2e5b0d1b8f221e9bf9e82429bd73bb/src/main/java/spark/route/RouteEntry.java#L31(路径匹配发生的地方),它看起来不像你想要的做是可能的。

RouteEntry 代码在“/”字符处拆分给定模式和给定 url,然后为每个组件查找“匹配”(相等或通配符)。

这里有一个更详细的解释:

url/foo/blah有 2 部分(在上面链接的 RouteEntry 代码的术语中),而/foo有 1 部分。对于匹配第一个模式的模式,它必须有 2 个部分:/foo/*是唯一有意义的部分。但是这个模式有两部分,这使得/foo第 49 行和第 78 行的 if 检查失败。唯一的特殊情况是第 71 行的 hack,它应该使模式/foo/*匹配 url /foo/,但不匹配/foo

于 2015-02-11T02:53:37.733 回答