这是 Servlet 3.0 规范中关于如何完成 URL 路径匹配的一段:
The first successful match is used with no further matches attempted:
- 容器将尝试找到请求路径与 servlet 路径的完全匹配。成功的匹配选择 servlet。
- 容器将递归地尝试匹配最长的路径前缀。这是通过使用“/”字符作为路径分隔符一次将路径树下移一个目录来完成的。最长的匹配决定了选择的 servlet。
- 如果 URL 路径中的最后一段包含扩展名(例如 .jsp),则 servlet 容器将尝试匹配处理扩展请求的 servlet。扩展名被定义为最后一个'.'之后的最后一段的一部分。特点。
- 如果前三个规则都没有导致 servlet 匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了一个“默认”servlet,它将被使用。许多容器为服务内容提供了一个隐式的默认 servlet。
容器必须使用区分大小写的字符串比较进行匹配
因此,完全匹配优先于前缀,前缀优先于扩展,最后是通用模式。
所以你可以做的只是添加一个/*
没有指定角色的通用映射。通用映射最后匹配,如果没有指定角色,任何人都不能像这样访问资源:
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
<!--No Authorization Required -->
<security-constraint>
<web-resource-collection>
<url-pattern>/faces/index.xhtml</url-pattern>
</web-resource-collection>
</security-constraint>
<!--All roles can access -->
<security-constraint>
<web-resource-collection>
<url-pattern>/faces/users.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
Servlet 3.0 文档请参阅第 12.1 节 URL 路径的使用