对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cn

过滤器

表单数据

浏览器只能通过 HTTP GET 或 HTTP POST 提交表单数据,但非浏览器客户端也可以 使用 HTTP PUT、PATCH 和 DELETE。Servlet API 要求方法仅支持 HTTP POST 的表单字段访问。ServletRequest.getParameter*()spring-doc.cn

该模块提供拦截 HTTP PUT、PATCH 和 DELETE 内容类型为 的请求,从中读取表单数据 请求的正文,并包装 以生成表单数据 可通过 Methods系列获得。spring-webFormContentFilterapplication/x-www-form-urlencodedServletRequestServletRequest.getParameter*()spring-doc.cn

请求头转发

当请求通过负载均衡器等代理时,主机、端口和 方案可能会更改,这使得创建指向正确 Host、Port 和 Scheme。spring-doc.cn

RFC 7239 定义了 HTTP 标头 代理可用于提供有关原始请求的信息。Forwardedspring-doc.cn

非标准标头

还有其他非标准标头,包括 、 和 .X-Forwarded-HostX-Forwarded-PortX-Forwarded-ProtoX-Forwarded-SslX-Forwarded-Prefixspring-doc.cn

X-转发主机

虽然不是标准的,但 X-Forwarded-Host: <host> 是一个事实上的标准标头,用于将原始主机传达给 downstream server 的例如,如果请求 发送到 将请求转发到 的代理,则可以发送标头 ,以通知服务器原始主机是 。example.com/resourcelocalhost:8080/resourceX-Forwarded-Host: example.comexample.comspring-doc.cn

X 转发端口

虽然不是标准的,但实际上是一个用于 将原始端口传送到下游服务器。例如,如果将请求 of 发送到代理,该代理将请求转发到 ,则可以发送 的标头 通知服务器原始端口为 .X-Forwarded-Port: <port>example.com/resourcelocalhost:8080/resourceX-Forwarded-Port: 443443spring-doc.cn

X 转发原型

虽然不是标准的,但 X-Forwarded-Proto: (https|http) 是事实上的标准标头,用于传达原始协议(例如 https / https) 到下游服务器。例如,如果请求 发送到 将请求转发到 的代理,则可以发送 的标头以通知服务器原始协议是 。example.com/resourcelocalhost:8080/resourceX-Forwarded-Proto: httpshttpsspring-doc.cn

X-转发 SSL

虽然不是标准的,但实际上是一个标准标头,用于传达 原始协议(例如 HTTPS / HTTPS)到下游服务器。例如,如果将请求 of 发送到代理,该代理将请求转发到 ,则 to 的标头会通知服务器 最初的协议是 。X-Forwarded-Ssl: (on|off)example.com/resourcelocalhost:8080/resourceX-Forwarded-Ssl: onhttpsspring-doc.cn

X 转发前缀

虽然不是标准的,但 X-Forwarded-Prefix: <prefix> 是事实上的标准标头,用于将原始 URL 路径前缀传达给 downstream server 的spring-doc.cn

使用 可能因部署方案而异,并且需要灵活 允许替换、删除或预置目标服务器的路径前缀。X-Forwarded-Prefixspring-doc.cn

场景 1:覆盖路径前缀spring-doc.cn

https://example.com/api/{path} -> http://localhost:8080/app1/{path}

前缀是 capture group 之前的路径的开头。对于代理, 前缀为 ,而对于服务器,前缀为 。在这种情况下,代理 可以发送,以使原始前缀覆盖 server prefix 的 .{path}/api/app1X-Forwarded-Prefix: /api/api/app1spring-doc.cn

方案 2:删除路径前缀spring-doc.cn

有时,应用程序可能希望删除前缀。例如,考虑 以下代理到服务器的映射:spring-doc.cn

https://app1.example.com/{path} -> http://localhost:8080/app1/{path}
https://app2.example.com/{path} -> http://localhost:8080/app2/{path}

proxy 没有前缀,而 applications 和 分别具有路径前缀 和 。代理可以发送到 让空前缀覆盖 Server Prefixes 和 。app1app2/app1/app2X-Forwarded-Prefix: /app1/app2spring-doc.cn

此部署方案的一个常见情况是许可证按 production application server 部署多个应用程序,并且最好为每个 server 来降低费用。另一个原因是在同一台服务器上运行更多应用程序 order 共享服务器运行所需的资源。spring-doc.cn

在这些情况下,应用程序需要一个非空的上下文根,因为有多个 应用程序。但是,这在 公共 API,应用程序可以在其中使用不同的子域,从而提供优势 如:spring-doc.cn

  • 增加安全性,例如同源策略spring-doc.cn

  • 应用程序的独立扩展(不同的域指向不同的 IP 地址)spring-doc.cn

方案 3:插入路径前缀spring-doc.cn

在其他情况下,可能需要在前面加上前缀。例如,考虑 以下代理到服务器的映射:spring-doc.cn

https://example.com/api/app1/{path} -> http://localhost:8080/app1/{path}

在这种情况下,代理的前缀为 ,服务器的前缀为 。代理可以发送以使原始前缀覆盖 server prefix 。/api/app1/app1X-Forwarded-Prefix: /api/app1/api/app1/app1spring-doc.cn

转发标头过滤器

ForwardedHeaderFilter是一个 Servlet 过滤器,它修改请求以便 a) 根据标头更改主机、端口和方案,以及 b) 删除它们 标头以消除进一步的影响。过滤器依赖于包装请求,并且 因此,它必须排在其他过滤器之前,例如 , 应该使用修改后的请求,而不是原始请求。ForwardedRequestContextFilterspring-doc.cn

安全注意事项

转发的 Headers 存在安全注意事项,因为应用程序无法知道 标头是由代理按预期添加的,还是由恶意客户端添加的。这就是为什么 应将信任边界的代理配置为删除来自外部的不受信任的标头。您还可以配置 with ,在这种情况下,它会删除但不使用 Headers。ForwardedForwardedHeaderFilterremoveOnly=truespring-doc.cn

调度程序类型

为了支持异步请求和错误调度,此 filter 应该与 和 映射。 如果使用 Spring Framework 的(参见 Servlet Config),则所有过滤器都会自动注册所有 dispatch 类型。但是,如果通过 注册过滤器,或者在 Spring Boot 中通过 注册过滤器,请确保除了 之外还包括 。DispatcherType.ASYNCDispatcherType.ERRORAbstractAnnotationConfigDispatcherServletInitializerweb.xmlFilterRegistrationBeanDispatcherType.ASYNCDispatcherType.ERRORDispatcherType.REQUESTspring-doc.cn

浅层 ETag

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

此策略可节省网络带宽,但不节省 CPU,因为必须为每个请求计算完整响应。 状态更改 HTTP 方法和其他 HTTP 条件请求标头(如 和 )不在此筛选器的范围内。控制器级别的其他策略 可以避免计算,并对 HTTP 条件请求提供更广泛的支持。 请参阅 HTTP 缓存If-MatchIf-Unmodified-Sincespring-doc.cn

此过滤器具有一个参数,该参数将过滤器配置为写入弱 ETag 类似于以下内容:(如 RFC 7232 第 2.3 节中所定义)。writeWeakETagW/"02a2d595e6ed9a0b24f027f2b63b134d6"spring-doc.cn

为了支持异步请求,必须映射此过滤器 替换为 API 的 API API 的 API 请求,以便筛选器可以延迟并成功生成 ETag 添加到最后一个异步调度的末尾。如果使用 Spring Framework 的(参见 Servlet Config) 所有过滤器都会自动为所有 Dispatch 类型注册。但是,如果注册 过滤器 via 或在 Spring Boot via 中确保包含 .DispatcherType.ASYNCAbstractAnnotationConfigDispatcherServletInitializerweb.xmlFilterRegistrationBeanDispatcherType.ASYNCspring-doc.cn

CORS

Spring MVC 通过 控制器。但是,当与 Spring Security 一起使用时,我们建议依赖必须在 Spring Security 的过滤器链之前订购的内置功能。CorsFilterspring-doc.cn

有关更多详细信息,请参阅有关 CORSCORS 筛选器的部分。spring-doc.cn