第 47 章 匹配URL地址

恐怕很多同志都有一个误解,就是Spring Security中配置URL的时候,要么配置成一个特定的URL,比如/admin/index.jsp,要么配置为某个路径下所有的URL,比如/admin/**。如果你真的这么认为的话,那就太小看Spring Security了,/**只是默认提供的AntUrlPathMatcher所支持功能的一部分而已,下面我们就来破除迷信,深入讨论一下匹配URL地址这方面的功能。

47.1. AntPathRequestMatcher

我们默认使用的URL匹配器就是这个AntPathRequestMatcher,它来自于http://ant.apache.org/项目,是一种简单易懂的路径匹配策略。

它为我们提供了三种通配符。

  • 通配符:?

    示例:/admin/g?t.jsp

    匹配任意一个字符,/admin/g?t.jsp可以匹配/admin/get.jsp和/admin/got.jsp或是/admin/gxt.do。不能匹配/admin/xxx.jsp。

  • 通配符:*

    示例:/admin/*.jsp

    匹配任意多个字符,但不能跨越目录。/*/index.jsp可以匹配/admin/index.jsp和/user/index.jsp,但是不能匹配/index.jsp和/user/test/index.jsp。

  • 通配符:**

    示例:/**/index.jsp

    可以匹配任意多个字符,可以跨越目录,可以匹配/index.jsp,/admin/index.jsp,/user/admin/index.jsp和/a/b/c/d/index.jsp

47.2. RegexRequestMatcher

如果默认的AntPathRequestMatcher无法满足需求,还可以选择使用更强大的RegexRequestMatcher,它支持使用正则表达式对URL地址进行匹配。

如果希望使用RegexRequestMatcher,就需要在配置文件中添加如下配置:

<http auto-config='true' request-matcher="regex">
    <intercept-url pattern="^(/.*)*/admin\.jsp$" access="ROLE_ADMIN" />
    <intercept-url pattern="^/.*$" access="ROLE_USER" />
</http>
        

上面例子中就使用了正则表达式进行URL匹配,^/.*$与之前使用的/**意义相同,可以匹配任意一个请求。^(/.*)*/admin\.jsp$表示任意一个目录下的admin.jsp请求。

有关正则表达式的更多信息请去网上找一下吧,与它相关的资源太多了。

实例在ch215。