技术分享 其他 查看内容

Shiro Ant风格URL详解

老高 | 发布于 2023-10-18 08:47| 浏览()| 评论() | 收藏() | 点赞() | 打印

摘要: Apache Ant 样式的路径有三种通配符匹配方法,利用它们可以组合出多种路径模式:

1 Ant 通配符

Apache Ant 样式的路径有三种通配符匹配方法,利用它们可以组合出多种路径模式:

通配符说明
?匹配任何单字符
*匹配0或者任意数量的字符
**匹配0或者更多的目录

2 匹配路径示例

URL路径说明
/app/*.x匹配(Matches)所有在app路径下的.x文件
/app/p?ttern匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
/**/example匹配(Matches) /app/example, /app/foo/example, 和 /example
/app/**/dir/file.*匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java
/**/*.jsp匹配(Matches)任何的.jsp 文件

需要注意的是,路径匹配遵循最长匹配原则(has more characters),例如/app/dir/file.jsp符合/**/*.jsp/app/dir/*.jsp两个路径模式,那么最终就是根据后者来匹配。

3 检测字符串是否为 Ant 风格 URL

3.1 基本规则

序号规则备注
1必须以 /开头该规则的检测已用正则实现
2必须不以 /结尾该规则的检测已用正则实现
3任意两个 /不能相连例如,不允许出现 //abc的形式;该规则的检测已用正则实现
4必须使用 RFC3986 文档规定的符号该规则的检测已用正则实现
5一节中,可以同时出现 *?,但不推荐 * ?连用例如,/*??b等同于 /*b,显然后面的形式更简单
6一节中,可以出现连续出现 [0-n] 个?例如,/a??b,将匹配/a11b,但不匹配/a1b
7一节中,可以出现 [0-n] 个*例如,/*a*b,将匹配/1a2b
8一节中,如果出现了 2 个 *,则该节不推荐存在任何其它字符例如,不推荐出现 /a/**b/b的形式,推荐 /a/**/b的形式,原因见下一规则;该规则的检测在前端中使用 JavaScript 实现
9一节中,连续出现[2,n] 个 * 和其它字符,效果等同于只使用 1 个 *经过试验,连续出现 2 个及以上的 *时的效果等同于只使用 1 个 *,例如/**a/b等同于/*a/b

*RFC3986 介绍:见外部网站:网址URL中特殊字符转义编码 https://blog.csdn.net/p312011150/article/details/78928003

**一节:以 / 开头到下一个 /之前的字符串,如 /abc/defabc为一节,def为一节

3.2 JavaScript 正则检测规则

JS脚本:

 var pattern = /^(\/[A-Za-z0-9*?#._~:@!$&'+,;%=\-\[\]\(\)]+)(\/[A-Za-z0-9*?#._~:@!$&'+,;%=\-\[\]\(\)]+)*$/g
 pattern.test();

4 在 Java 中检测是否匹配 Ant URL

public class AntPathMatcherTest {

	private AntPathMatcher pathMatcher = new AntPathMatcher();

	@Test
	public void test() {
		pathMatcher.setCachePatterns(true);
		pathMatcher.setCaseSensitive(true);
		pathMatcher.setTrimTokens(true);
		pathMatcher.setPathSeparator("/");

		Assert.assertTrue(pathMatcher.match("/*", "/test"));
		Assert.assertTrue(pathMatcher.match("/test*/**/tt", "/test1/t/b/tt"));
		Assert.assertTrue(pathMatcher.match("/*/*", "/test/test"));
	}
}


发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)

表情