|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
过滤器
表单数据
浏览器只能通过HTTP GET或HTTP POST提交表单数据,但非浏览器客户端也可以使用HTTP PUT、PATCH和DELETE。Servlet API要求ServletRequest.getParameter*()方法仅支持HTTP POST的表单字段访问。
The spring-web 模块提供了 FormContentFilter 来拦截具有 application/x-www-form-urlencoded 内容类型的 HTTP PUT、PATCH 和 DELETE 请求,从请求体中读取表单数据,并包装 ServletRequest 以使表单数据可以通过 ServletRequest.getParameter*() 系列方法获取。
请求头转发
当请求通过代理(如负载均衡器)时,主机、端口和协议可能会发生变化,这使得从客户端的角度创建指向正确主机、端口和协议的链接成为一个挑战。
RFC 7239 定义了 Forwarded HTTP 标头,代理可以使用该标头提供有关原始请求的信息。还有其他非标准标头,包括 X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-Proto、X-Forwarded-Ssl 和 X-Forwarded-Prefix。
ForwardedHeaderFilter 是一个Servlet过滤器,用于修改请求以
a) 根据 Forwarded 头信息更改主机、端口和协议,并 b) 移除这些头信息以消除进一步的影响。该过滤器依赖于包装请求,并且必须在其他过滤器之前进行排序,例如 RequestContextFilter,以便它们可以使用修改后而不是原始的请求。
请求头转发存在安全考虑,因为应用程序无法知道这些标头是被代理按预期添加的,还是被恶意客户端添加的。这就是为什么在信任边界的代理应该被配置为移除来自外部的不可信Forwarded标头。你还可以配置ForwardedHeaderFilter使用removeOnly=true,在这种情况下,它会移除但不使用这些标头。
浅层ETag
The ShallowEtagHeaderFilter 过滤器通过缓存写入响应的内容并从中计算MD5哈希来创建一个“浅层”ETag。下次客户端发送请求时,它会执行相同的操作,但还会将计算出的值与If-None-Match 请求头进行比较,如果两者相等,则返回304(未修改)。
这种策略节省网络带宽但不节省CPU资源,因为每个请求都必须计算完整响应。
状态更改的HTTP方法以及其他HTTP条件请求标头(如If-Match和If-Unmodified-Since)不在该过滤器的处理范围内。控制器层面的其他策略可以避免计算,并对HTTP条件请求提供更广泛的支持。
请参阅HTTP缓存。
此过滤器有一个 writeWeakETag 参数,用于配置过滤器以写入类似于以下的弱 ETags: W/"02a2d595e6ed9a0b24f027f2b63b134d6"(如在
RFC 7232 第 2.3 节 中定义)。
CORS
Spring MVC 通过注解在控制器上提供了对 CORS 配置的细粒度支持。然而,当与 Spring Security 一起使用时,我们建议依赖内置的 CorsFilter,该组件必须在 Spring Security 的过滤器链之前进行排序。