|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
过滤器
表单数据
浏览器只能通过 HTTP GET 或 HTTP POST 提交表单数据,但非浏览器客户端还可以使用 HTTP PUT、PATCH 和 DELETE。Servlet API 要求 ServletRequest.getParameter*() 方法仅对 HTTP POST 支持表单字段的访问。
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 头信息更改主机、端口和协议(scheme),以及 b) 移除这些头信息,以避免后续产生影响。该过滤器通过包装请求来实现功能,因此必须排在其他过滤器(例如 RequestContextFilter)之前,以确保这些过滤器能够处理修改后的请求,而不是原始请求。
由于应用程序无法判断转发头(forwarded headers)是由代理按预期添加的,还是由恶意客户端伪造的,因此在使用转发头时存在安全方面的考量。这就是为什么应在信任边界的代理上进行配置,以移除来自外部的不可信 Forwarded 头信息。你也可以将 ForwardedHeaderFilter 配置为 removeOnly=true,在这种情况下,该过滤器会移除这些头信息但不会使用它们。
为了支持异步请求和错误分发,此过滤器应映射到DispatcherType.ASYNC以及DispatcherType.ERROR。
如果使用 Spring Framework 的AbstractAnnotationConfigDispatcherServletInitializer
(请参阅Servlet 配置),所有过滤器将自动为所有分发类型注册。但是,如果通过web.xml注册过滤器,或在 Spring Boot 中通过FilterRegistrationBean注册,请确保除了DispatcherType.REQUEST之外,还包含DispatcherType.ASYNC和DispatcherType.ERROR。
浅层ETag
ShallowEtagHeaderFilter 过滤器通过缓存写入响应的内容并从中计算 MD5 哈希值来创建一个“浅层”ETag。下一次客户端发送请求时,它会执行相同的操作,但还会将计算出的值与 If-None-Match 请求头进行比较,如果两者相等,则返回 304(NOT_MODIFIED)。
该策略节省了网络带宽,但并未节省 CPU 资源,因为每次请求都必须完整计算响应内容。
状态变更的 HTTP 方法以及其他 HTTP 条件请求头(例如 If-Match 和
If-Unmodified-Since)不在本过滤器的处理范围内。在控制器层面采用其他策略
可以避免进行完整计算,并对 HTTP 条件请求提供更广泛的支持。
参见 HTTP 缓存。
该过滤器具有一个 writeWeakETag 参数,用于配置过滤器以写入弱 ETag,
类似于以下格式:W/"02a2d595e6ed9a0b24f027f2b63b134d6"(如
RFC 7232 第 2.3 节 中所定义)。
为了支持异步请求,此过滤器必须使用DispatcherType.ASYNC进行映射,以便过滤器能够延迟并成功生成 ETag 直到最后一次异步调度结束。如果使用 Spring Framework 的AbstractAnnotationConfigDispatcherServletInitializer(请参阅Servlet 配置),所有过滤器将自动为所有调度类型注册。但是,如果通过web.xml注册过滤器,或在 Spring Boot 中通过FilterRegistrationBean注册,请务必包含DispatcherType.ASYNC。
跨域资源共享(CORS)
Spring MVC 通过控制器上的注解提供了细粒度的 CORS 配置支持。然而,当与 Spring Security 一起使用时,我们建议依赖内置的 CorsFilter,该过滤器必须排在 Spring Security 过滤器链之前。