我正在尝试制作符合以下网址的过滤条件:
/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分配给同一个过滤器。
请不要说将函数存储在变量中,以便我使用它两次,因为我觉得它根本不干净..
答案 0 :(得分:7)
根据https://github.com/perwendel/spark/blob/1ecd428c8e2e5b0d1b8f221e9bf9e82429bd73bb/src/main/java/spark/route/RouteEntry.java#L31(路径匹配发生的地方),它看起来不像你想做的那样。
RouteEntry代码拆分给定的模式,并在' /'字符,然后寻找"匹配" (每个组件的(相等或通配符)。
这里有一个更详细的解释:
网址/foo/blah
有2个部分(在上面链接的RouteEntry代码的术语中),而/foo
有1个部分。对于与第一个匹配的模式,它必须有2个部分:/foo/*
是唯一有意义的部分。但是这个模式有2个部分,这使得/foo
在第49行和第78行都检查失败。唯一的特殊情况是第71行的hack,它应该使模式/foo/*
与url {匹配} {1}},但不是/foo/
。