捕获所有可能的路径参数jax-rs正则表达式。

3

如何设置正则表达式@Path("<what_regex>")以捕获所有可能的路径参数深度(除了特定的某些路径,这些路径应由其他方法处理)?

例如:

/{path1}/{path1}/{path1}/{path1}/{path1}/ 等等

同时还要映射以下内容:

/create
/read
/update
/delete

到其他Jax-rs资源方法。
@Singleton
@Path("/")
public class MyRest {
    @GET
    @Path({pathParam}) /* This works */
    public Response getSomething(...){}

    @POST
    @Path("create") /* Along with this */
    public Response createSomething(...){}

    // and so on
}
1个回答

17

首先,你可能无法通过一个正则表达式来匹配这些路径/{path1}/{path1}/{path1}/{path1}/{path1}/,因为你无法用一个正则表达式匹配未定义数量的参数。

不过,看起来使用的正则表达式引擎是 Java 的(挺合理的)。因此,你可以使用负向先行断言来确保你没有捕获到关键词。所以我想你可以像下面这样写:

@Path("/{path: (?!create|read|update|delete).*}")

将路径变量使用“/”作为分隔符拆分。

不过,你是否可以只需按顺序排列功能,以便最后检查一般情况?我认为这是最简单的...

然后,您只需使用:

@Path("/{path: .*}")

哪个更容易,并且需要更少的样板文件。

编辑:
要精确一些,第一个不会匹配像“/create/anythingelse”这样的网址,因为它只禁止出现/create(当然,对于您的其他关键字也适用同样的情况)。


我尝试使用http://xenon.stanford.edu/~xusch/regexp/进行检查,但是我得到了“失败:输入不完整”的结果。 - user1302575
这是什么意思?试一下 - Loamhoof
无论如何,似乎您忘记了首先基于方法进行映射,因此在您的示例中不可能存在任何冲突。 - Loamhoof
这个可行:@Path("/{path: .}"),我的意思是我真的不必这样做:@Path("/{path: (?!create|read|update|delete).}")。 - user1302575
允许所有子路径的这种方法是否存在安全风险? - Nephilim
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接