当前位置:网站首页 > 技术博客 > 正文

spring 跨域问题



在任何现代浏览器中,随着通过 REST API 获取数据的 HTML5 和 JS 客户端的出现,跨源资源共享 (CORS) 已成为一种相关规范。

通常,提供 JS 的主机(如 )与提供数据的主机(如 )不同。在这种情况下,CORS 可以实现跨域通信。

Spring 为 CORS 提供了一流的 支持,为在任何 Spring 或 Spring Boot Web 应用中配置 CORS 提供了简单而强大的方法。

启用 CORS 非常简单,只需添加注解 。

我们可以通过几种不同的方式来实现。

在上面的示例中,我们只为 方法启用了 CORS。我们可以看到,我们没有为 注解设置任何配置,因此它使用的是默认值:

  • 允许所有 origin。
  • 允许使用的 HTTP 方法是 注解(本例中为 )中指定的方法。
  • 缓存预检响应的时间(maxAge)为 30 分钟。

这次,我们在类级别上添加了 。因此, 和 方法都启用了 。我们可以通过指定以下注解属性的值来自定义配置:、、、、 或 。

Spring 将合并两个注解的属性,创建合并的 CORS 配置。

这里,两个方法的 都是 秒, 方法允许所有 origin,而 方法只允许来自 的 origin。

Spring 允许我们在 controller 中定义全局 CORS 配置,作为基于注解的细粒度配置的替代方案。这与使用基于 的解决方案类似,但可以在 Spring MVC 中声明,并与细粒度的 配置相结合。

默认情况下,允许所有 origin 以及 GET、HEAD 和 POST 方法。

上面的示例允许从任何 origin 向应用中的任何端点发出 CORS 请求。

为了进一步细化控制, 方法会返回一个 对象,我们可以使用该对象进行其他配置。还有一个 方法可以让我们指定一个允许的 origin 数组。如果我们需要在运行时从外部加载这个数组,这将非常有用。

此外,我们还可以使用 、、、 和 来设置响应头和自定义选项。例如,我们可以通过在上述配置中添加 对所有 HTTP 方法开放 CORS。

值得注意的是,自 2.4.0 版起,Spring Boot 除了引入 之外,还引入了 。这个新元素为定义 pattern 提供了更大的灵活性。此外,当 为 时, 不能包含特殊值 ,因为该值不能在 响应头中设置。要解决这个问题并允许一组 origin 的凭证,我们可以明确列出它们,或者考虑使用 来代替。

启用最基本 CORS 的 XML 配置如下,通过 属性指定路径模式,其默认属性与 Java 配置相同:

还可以使用自定义属性声明多个 CORS mapping:

如果我们在项目中使用 Spring Security,我们必须采取额外的步骤确保它与 CORS 协作良好。这是因为 CORS 需要首先处理。否则,Spring Security 会在请求到达 Spring MVC 之前将其拒绝。

幸运的是,Spring Security 提供了开箱即用的解决方案:

我们可以配置 CORS 以覆盖默认的 Spring Security CORS 处理器。为此,我们需要添加一个 Bean,使用 实例来处理 CORS 配置。如果添加了 Bean, 方法就会使用 ,否则就会使用 。如果两者都未配置,则使用 Spring MVC pattern inspector handler。

让我们将 Bean 添加到 类中:

在此,我们使用默认构造函数创建一个 实例,然后设置允许的 origin、允许的方法和响应头。通过上述配置,我们可以从任何 origin、任何方法和任何请求头向应用中的任何端点发出 CORS 请求。最后,我们将其作为参数传递给 实例,并将其返回。

CORS 请求会自动调度给各种已注册的 HandlerMapping。它们处理 CORS 预检请求,并使用 CorsProcessor 实现(默认为 )拦截 CORS 简单和实际请求,以添加相关的 CORS 响应头(如 )。

CorsConfiguration 允许我们指定如何处理 CORS 请求,包括允许的 origin、header 和方法等。我们可以通过多种方式提供它:

  • 通过 AbstractHandlerMapping#setCorsConfiguration(),我们可以指定一个映射到路径模式(如 )上的 ,其中包含多个 。
  • 子类可以通过覆盖 方法来提供自己的 。
  • Handler 可以实现 CorsConfigurationSource 接口(就像现在的 一样),为每个请求提供一个 。

在本文中,我们展示了 Spring 如何为在应用程序中启用 CORS 提供支持。

我们从 Controller 的配置开始。我们看到,只需添加注解 ,即可在一个特定方法或整个 Controller 中启用 CORS。

此外,我们还了解到,要实现在 Controller 之外控制 CORS 配置,我们可以使用 Java 配置或 XML 配置。


参考:

  • 上一篇: seekbar设置进度值
  • 下一篇: pcap 格式
  • 版权声明


    相关文章:

  • seekbar设置进度值2025-01-26 10:29:59
  • 什么是 vsphere 的网络虚拟化平台?2025-01-26 10:29:59
  • 总结移位指令的使用方法2025-01-26 10:29:59
  • 面向对象设计6大原则2025-01-26 10:29:59
  • ntp time server monitor2025-01-26 10:29:59
  • pcap 格式2025-01-26 10:29:59
  • 01背包问题动态规划详解2025-01-26 10:29:59
  • 左移运算符溢出2025-01-26 10:29:59
  • java匿名内部类可以继承其他类吗2025-01-26 10:29:59
  • 程序员java开发2025-01-26 10:29:59