过滤器

spring-web 模块提供了一些有用的过滤器:

Servlet 过滤器可以在 web.xml 配置文件中配置,或者使用 Servlet 注解。 如果你正在使用 Spring Boot,你可以 将它们声明为 bean 并将其配置为应用程序的一部分

表单数据

浏览器只能通过 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.ASYNCDispatcherType.ERROR 映射。 如果使用 Spring Framework 的 AbstractAnnotationConfigDispatcherServletInitializer (参见 Servlet 配置), 所有过滤器都会自动为所有调度类型注册。但是,如果通过 web.xml 或在 Spring Boot 中通过 FilterRegistrationBean 注册过滤器,请务必除了 DispatcherType.REQUEST 之外, 还包含 DispatcherType.ASYNCDispatcherType.ERROR

浅层 ETag

ShallowEtagHeaderFilter 过滤器通过缓存写入响应的内容并计算 其 MD5 哈希值来创建“浅层”ETag。下次客户端发送请求时,它会执行相同的操作, 但它还会将计算出的值与 If-None-Match 请求头进行比较, 如果两者相等,则返回 304 (NOT_MODIFIED)。

此策略节省了网络带宽,但不节省 CPU,因为每次请求都必须计算完整的响应。 状态更改的 HTTP 方法和其他 HTTP 条件请求头(如 If-MatchIf-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 的过滤器链之前排序。

有关更多详细信息,请参阅 CORSCORS 过滤器 部分。

URL 处理器

在之前的 Spring Framework 版本中,Spring MVC 可以配置为在将传入请求映射到控制器方法时 忽略 URL 路径中的尾部斜杠。这可以通过在 PathMatchConfigurer 上启用 setUseTrailingSlashMatch 选项来完成。这意味着发送 "GET /home/" 请求将由带有 @GetMapping("/home") 注解的控制器方法处理。

此选项已弃用,但应用程序仍应以安全的方式处理此类请求。 UrlHandlerFilter Servlet 过滤器就是为此目的设计的。它可以配置为:

  • 当接收到带有尾部斜杠的 URL 时,用 HTTP 重定向状态进行响应,将浏览器发送到不带尾部斜杠的 URL 变体。

  • 包装请求,使其表现得像请求是在没有尾部斜杠的情况下发送的,并继续处理请求。

以下是如何为博客应用程序实例化和配置 UrlHandlerFilter