过滤器
表单数据
浏览器只能通过 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 路径中的尾部斜杠。这可以通过在 PathMatchConfigurer
上启用 setUseTrailingSlashMatch
选项来完成。这意味着发送 "GET /home/" 请求将由带有 @GetMapping("/home")
注解的控制器方法处理。
此选项已弃用,但应用程序仍应以安全的方式处理此类请求。
UrlHandlerFilter
Servlet 过滤器就是为此目的设计的。它可以配置为:
-
当接收到带有尾部斜杠的 URL 时,用 HTTP 重定向状态进行响应,将浏览器发送到不带尾部斜杠的 URL 变体。
-
包装请求,使其表现得像请求是在没有尾部斜杠的情况下发送的,并继续处理请求。
以下是如何为博客应用程序实例化和配置 UrlHandlerFilter
: