过滤器
表单数据
浏览器只能通过 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*() 方法族可用。
转发头
Unresolved directive in filters.adoc - include::partial$web/forwarded-headers.adoc[]
ForwardedHeaderFilter
ForwardedHeaderFilter 是一个 Servlet 过滤器,它修改请求以便
a) 根据 Forwarded 头信息更改主机、端口和方案,以及 b) 删除这些头信息以消除进一步的影响。
该过滤器依赖于包装请求,因此它必须在其他过滤器(例如 RequestContextFilter)之前排序,这些过滤器应该与修改后的请求而不是原始请求一起工作。
安全注意事项
转发头存在安全考虑,因为应用程序无法知道这些头信息是像预期一样由代理添加的,还是由恶意客户端添加的。
这就是为什么应该配置信任边界处的代理来删除来自外部的不受信任的 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。
URL 处理器
在之前的 Spring Framework 版本中,Spring MVC 可以配置为在将传入请求映射到控制器方法时忽略 URL 路径中的尾部斜杠。
这意味着发送 "GET /home/" 请求将由带有 @GetMapping("/home") 注解的控制器方法处理。
此选项在 6.0 中已弃用并在 7.0 中移除,但应用程序仍应以安全的方式处理此类请求。
UrlHandlerFilter Servlet 过滤器就是为此目的而设计的。
它可以配置为:
-
当接收到带有尾部斜杠的 URL 时,以 HTTP 重定向状态响应,将浏览器发送到不带尾部斜杠的 URL 变体。
-
包装请求,使其表现得像没有尾部斜杠的请求一样,并继续处理请求。
以下是如何为博客应用程序实例化和配置 UrlHandlerFilter: