CORS 规范区分了 预检(preflight)、简单和实际请求。要了解 CORS 如何工作,你可以阅读 这篇文章,以及其他许多文章,或者查看规范以了解更多细节。
Spring MVC HandlerMapping 的实现提供了对 CORS 的内置支持。在成功地将一个请求映射到一个处理程序后,HandlerMapping 实现会检查给定请求和处理程序的 CORS 配置,并采取进一步行动。预检请求被直接处理,而简单和实际的 CORS 请求被拦截、验证,并设置必要的 CORS 响应头。
为了启用跨源请求(也就是说,Origin 头存在并且与请求的主机不同),你需要有一些明确声明的 CORS 配置。如果没有找到匹配的 CORS 配置,预检请求将被拒绝。在简单和实际的 CORS 请求的响应中没有添加 CORS 头,因此,浏览器会拒绝它们。
每个 HandlerMapping 都可以用基于 URL 模式的 CorsConfiguration 映射进行单独 配置。在大多数情况下,应用程序使用 MVC Java 配置或 XML 命名空间来声明这种映射,这导致一个单一的全局映射被传递给所有 HandlerMapping 实例。
你可以将 HandlerMapping 级别的全局 CORS 配置与更精细的、处理程序级别的 CORS 配置相结合。例如,有注解的控制器可以使用类或方法级的 @CrossOrigin
注解(其他处理程序可以实现 CorsConfigurationSource)。
结合全局和本地配置的规则通常是加法的 — 例如,所有全局和所有本地起源。对于那些只能接受一个值的属性,例如 allowCredentials 和 maxAge,本地的会覆盖全局的值。参见 CorsConfiguration#combine(CorsConfiguration) 了解更多细节。
:::info 要从源代码中了解更多信息或进行高级定制,可以参考这些代码
- CorsConfiguration
- CorsProcessor, DefaultCorsProcessor
- AbstractHandlerMapping :::