如何使用正则表达式来为SpringMVC的拦截器设置拦截URI
- 需求来源:由于员工的操作权限限制将从前后端同时限制,对无权访问的用户,既不告知访问地址(前端),也在其访问对应地址时拦截请求(后端)。为保证后端拦截的完备性,需要对下述地址进行拦截:
"^/employee/\\d+$"
- 这一正则表达式很好理解,自己来写正则表达式的判断也很简单,但疑难点在于:
- 疑难点1:不明确SpringMVC的拦截器配置是否支持正则表达式书写
- 疑难点2:如果支持,具体形式是什么
因此,我们需要深入源码,去查查看SpringMVC做URI匹配的代码,其实现的逻辑是什么。在层层深入后,我们定位到了PathMatcher.class文件,然后在查询了相关的PathMatcher文档后,我们对其内含方法有了了解:
public interface PathMatcher {
// 判断path是否是一个模式字符串(一般含有指定风格的特殊通配符就算是模式了)
boolean isPattern(String var1);
// 采用Ant风格的路径匹配
boolean match(String var1, String var2);
// 判断path是否和模式pattern前缀匹配(前缀匹配:path的前缀匹配上patter了即可,当然全部匹配也是可以的)
boolean matchStart(String var1, String var2);
// 返回和pattern模式真正匹配上的那部分字符串
String extractPathWithinPattern(String var1, String var2);
// 提取path中模板变量
Map<String, String> extractUriTemplateVariables(String var1, String var2);
// 路径比较器,用于排序确定优先级高低
Comparator<String> getPatternComparator(String var1);
// 合并两个pattern模式,组合算法由具体实现自由决定
String combine(String var1, String var2);
}
match采用Ant风格,根据查询到的资料,Ant风格包括四个部分:
- “?”: 匹配任意一个字符
- “*”: 匹配任意数量字符
- “**”: 匹配任意层级的URI路径/目录
- {PatchVariable: 正则表达式}: 匹配满足正则表达式限制下的PatchVariable
至此,我们对于疑难点的疑问得到解答:
- SpringMVC采用Ant风格匹配URI,该风格支持正则表达式
- {PatchVariable: 正则表达式}是该风格下正则表达式的匹配格式
因此,常规的正则表达式"^/employee/\\d+$"
改为"/employee/{id:\\d+}"
即可满足限定要求