|
对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
过滤器
表单数据
浏览器只能通过 HTTP GET 或 HTTP POST 提交表单数据,但非浏览器客户端也可以
使用 HTTP PUT、PATCH 和 DELETE。Servlet API 需要ServletRequest.getParameter*()仅支持对 HTTP POST 进行表单字段访问的方法。
这spring-web模块提供FormContentFilter拦截 HTTP PUT、PATCH 和 DELETE
内容类型为application/x-www-form-urlencoded,从
请求的正文,并将ServletRequest制作表单数据
可通过ServletRequest.getParameter*()方法系列。
请求头转发
当请求通过代理(例如负载均衡器)时,主机、端口和 方案可能会发生变化,这使得创建指向正确链接成为一项挑战 从客户端的角度来看,主机、端口和方案。
RFC 7239 定义了ForwardedHTTP 标头
代理可以使用该信息来提供有关原始请求的信息。还有其他的
非标准标头,包括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,在这种情况下,它会删除但不使用标头。
为了支持异步请求和错误分派
filter 应映射为DispatcherType.ASYNC还有DispatcherType.ERROR.
如果使用 Spring Framework 的AbstractAnnotationConfigDispatcherServletInitializer(参见 Servlet 配置)所有过滤器都会自动注册所有分派
类型。但是,如果通过web.xml或在 Spring Boot 中通过FilterRegistrationBean请务必包括DispatcherType.ASYNC和DispatcherType.ERROR除了DispatcherType.REQUEST.
浅 ETag
这ShallowEtagHeaderFilterfilter 通过缓存内容创建“浅层”ETag
写入响应并从中计算 MD5 哈希值。下次客户端发送
它做同样的事情,但它也会将计算值与If-None-Matchrequest 标头,如果两者相等,则返回 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 的过滤器链之前排序。