此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
路径匹配
Servlet API 将完整的请求路径公开为requestURI
并进一步细分
到contextPath
,servletPath
和pathInfo
其值因
Servlet 被映射。根据这些输入,Spring MVC 需要确定查找路径
用于映射处理程序,这应该排除contextPath
和任何servletMapping
前缀(如果适用)。
这servletPath
和pathInfo
被解码,这使得它们无法进行比较
直接到完整的requestURI
为了派生 lookupPath 并使其
解码requestURI
.但是,这引入了它自己的问题,因为
path 可能包含编码的保留字符,例如 或 can 反过来
在解码后改变路径的结构,这也可以带来安全性
问题。此外,Servlet 容器可能会规范化"/"
";"
servletPath
到变化
度数,这使得它进一步无法执行startsWith
比较
这requestURI
.
这就是为什么最好避免依赖servletPath
它附带
基于前缀servletPath
映射类型。如果DispatcherServlet
被映射为
默认 Servlet,带或不带前缀 with 和 Servlet
container 是 4.0+,则 Spring MVC 能够检测 Servlet 映射类型并避免
使用"/"
"/*"
servletPath
和pathInfo
完全。在 3.1 Servlet 容器上,
假设相同的 Servlet 映射类型,可以通过提供
一个UrlPathHelper
跟alwaysUseFullPath=true
通过路径匹配
MVC 配置。
幸运的是,默认的 Servlet 映射是一个不错的选择。然而,仍然有
一个问题是"/"
requestURI
需要解码才能将其与
控制器映射。这又是不可取的,因为有可能解码
更改路径结构的保留字符。如果不需要此类字符,
然后你可以拒绝它们(如 Spring Security HTTP 防火墙),或者你可以配置UrlPathHelper
跟urlDecode=false
但控制器映射需要与
编码路径,可能并不总是正常工作。此外,有时DispatcherServlet
需要与另一个 Servlet 共享 URL 空间,并且可能需要
按前缀映射。
上述问题在使用PathPatternParser
和解析的模式,如
字符串路径匹配的替代方法AntPathMatcher
.这PathPatternParser
有
从5.3版开始可用于Spring MVC,并且默认情况下从以下位置启用
版本 6.0。与AntPathMatcher
需要解码查找路径或
控制器映射编码,解析的PathPattern
与解析后的表示形式匹配
的路径称为RequestPath
,一次一个路径段。这允许解码和
单独清理路径段值,而不会有改变结构的风险
路径的。解析PathPattern
还支持使用servletPath
前缀映射
只要使用 Servlet 路径映射并且前缀保持简单,即它没有
编码字符。有关模式语法详细信息和比较,请参阅模式比较。