此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

路径匹配

Servlet API 将完整的请求路径公开为requestURI并进一步细分 到contextPath,servletPathpathInfo其值因 Servlet 被映射。根据这些输入,Spring MVC 需要确定查找路径 用于映射处理程序,这应该排除contextPath和任何servletMapping前缀(如果适用)。spring-doc.cadn.net.cn

servletPathpathInfo被解码,这使得它们无法进行比较 直接到完整的requestURI为了派生 lookupPath 并使其 解码requestURI.但是,这引入了它自己的问题,因为 path 可能包含编码的保留字符,例如 或 can 反过来 在解码后改变路径的结构,这也可以带来安全性 问题。此外,Servlet 容器可能会规范化"/"";"servletPath到变化 度数,这使得它进一步无法执行startsWith比较 这requestURI.spring-doc.cadn.net.cn

这就是为什么最好避免依赖servletPath它附带 基于前缀servletPath映射类型。如果DispatcherServlet被映射为 默认 Servlet,带或不带前缀 with 和 Servlet container 是 4.0+,则 Spring MVC 能够检测 Servlet 映射类型并避免 使用"/""/*"servletPathpathInfo完全。在 3.1 Servlet 容器上, 假设相同的 Servlet 映射类型,可以通过提供 一个UrlPathHelperalwaysUseFullPath=true通过路径匹配 MVC 配置。spring-doc.cadn.net.cn

幸运的是,默认的 Servlet 映射是一个不错的选择。然而,仍然有 一个问题是"/"requestURI需要解码才能将其与 控制器映射。这又是不可取的,因为有可能解码 更改路径结构的保留字符。如果不需要此类字符, 然后你可以拒绝它们(如 Spring Security HTTP 防火墙),或者你可以配置UrlPathHelperurlDecode=false但控制器映射需要与 编码路径,可能并不总是正常工作。此外,有时DispatcherServlet需要与另一个 Servlet 共享 URL 空间,并且可能需要 按前缀映射。spring-doc.cadn.net.cn

上述问题在使用PathPatternParser和解析的模式,如 字符串路径匹配的替代方法AntPathMatcher.这PathPatternParser有 从5.3版开始可用于Spring MVC,并且默认情况下从以下位置启用 版本 6.0。与AntPathMatcher需要解码查找路径或 控制器映射编码,解析的PathPattern与解析后的表示形式匹配 的路径称为RequestPath,一次一个路径段。这允许解码和 单独清理路径段值,而不会有改变结构的风险 路径的。解析PathPattern还支持使用servletPath前缀映射 只要使用 Servlet 路径映射并且前缀保持简单,即它没有 编码字符。有关模式语法详细信息和比较,请参阅模式比较spring-doc.cadn.net.cn