springBoot中的CORS跨域注解@CrossOrigin详解

 更新时间:2023年12月04日 08:31:40   作者:allway2  
这篇文章主要介绍了springBoot中的CORS跨域注解@CrossOrigin详解,通常,服务于 JS 的主机(例如 example.com)与服务于数据的主机(例如 api.example.com)是不同的,在这种情况下,CORS 可以实现跨域通信,需要的朋友可以参考下

1、概述

在任何现代浏览器中,随着 HTML5 和 JS 客户端的出现,跨域资源共享 (CORS)是一项相关规范,这些客户端通过 REST API 使用数据。

通常,服务于 JS 的主机(例如 example.com)与服务于数据的主机(例如 api.example.com)是不同的。在这种情况下,CORS 可以实现跨域通信。

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

2.控制器方法CORS配置

启用 CORS 很简单——只需添加注释@CrossOrigin。

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

2.1 @CrossOrigin在@RequestMapping-带注释的处理程序方法上

@RestController
@RequestMapping("/account")
public class AccountController {
    @CrossOrigin
    @RequestMapping(method = RequestMethod.GET, path = "/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

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

  • 允许所有来源。
  • 允许的 HTTP 方法是在@RequestMapping注释中指定的方法(本例中为 GET)。
  • 预检响应的缓存时间 ( maxAge ) 为 30 分钟。

2.2 控制器上的@CrossOrigin

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
    @RequestMapping(method = RequestMethod.GET, path = "/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

这一次,我们在类级别添加了@CrossOrigin。

因此,retrieve()和remove()方法都启用了它。

我们可以通过指定注释属性之一的值来自定义配置:origins、methods、allowedHeaders、exposedHeaders、allowCredentials或maxAge。

2.3 @CrossOrigin关于控制器和处理程序方法

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
    @CrossOrigin("http://example.com")
    @RequestMapping(method = RequestMethod.GET, "/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

Spring 将结合来自两个注解的属性来创建一个合并的 CORS 配置。

在这里,两个方法的maxAge都是 3,600 秒,remove()方法将允许所有来源,retrieve()方法只允许来自//example.com的来源。

3. 全局 CORS 配置

作为细粒度的基于注释的配置的替代方案,Spring 允许我们在控制器之外定义一些全局 CORS 配置。这类似于使用基于Filter的解决方案,但可以在 Spring MVC 中声明并结合细粒度的@CrossOrigin配置。

默认情况下,允许所有来源和 GET、HEAD 和 POST 方法。

3.1 Java配置

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

上面的示例启用了从任何来源到应用程序中任何端点的 CORS 请求。

为了进一步锁定这一点,registry.addMapping方法返回一个CorsRegistration对象,我们可以将其用于其他配置。还有一个allowedOrigins方法可以让我们指定一个允许来源的数组。如果我们需要在运行时从外部源加载此数组,这将很有用。

此外,还有allowedMethods、allowedHeaders、exposedHeaders、maxAge 和allowCredentials,我们可以使用它们来设置响应标头和自定义选项。

3.2 XML 命名空间

这个最小的 XML 配置在/**路径模式上启用了 CORS,其默认属性与 JavaConfig 相同:

<mvc:cors>
    <mvc:mapping path="/**" />
</mvc:cors>

也可以使用自定义属性声明多个 CORS 映射:

<mvc:cors>
    <mvc:mapping path="/api/**"
        allowed-origins="http://domain1.com, http://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2" allow-credentials="false"
        max-age="123" />
    <mvc:mapping path="/resources/**"
        allowed-origins="http://domain1.com" />
</mvc:cors>

4. 带有 Spring Security 的 CORS

如果我们在项目中使用 Spring Security,我们必须采取额外的步骤来确保它与 CORS 兼容。那是因为需要先处理 CORS。否则,Spring Security 将在请求到达 Spring MVC 之前拒绝该请求。

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

@EnableWebSecurity
	public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	    @Override
	    protected void configure(HttpSecurity http) throws Exception {
	        http.cors().and()...
	    }
	}

这篇文章更详细地解释了它。

5. 它是如何工作的

CORS 请求会自动分派到各种已注册的HandlerMappings。它们处理 CORS 预检请求并使用CorsProcessor 实现(默认为DefaultCorsProcessor)拦截 CORS 简单和实际请求,以添加相关的 CORS 响应标头(例如Access-Control-Allow-Origin)。

CorsConfiguration允许我们指定应该如何处理 CORS 请求,包括允许的来源、标头和方法等。我们可以通过多种方式提供:

AbstractHandlerMapping#setCorsConfiguration()允许我们指定一个Map,其中几个CorsConfiguration映射到路径模式,例如/api/**。子类可以通过覆盖AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法来提供自己的CorsConfiguration 。处理程序可以实现CorsConfigurationSource 接口(就像现在的ResourceHttpRequestHandler一样)为每个请求提供CorsConfiguration。

6. 结论

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

我们从控制器的配置开始。我们看到我们只需要添加注解@CrossOrigin来启用 CORS 到一个特定的方法或整个控制器。

此外,我们了解到,为了在控制器之外控制 CORS 配置,我们可以使用 JavaConfig 或 XML 在配置文件中顺利执行此操作。

到此这篇关于springBoot中的CORS跨域注解@CrossOrigin详解的文章就介绍到这了,更多相关CORS跨域注解@CrossOrigin内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot日期转换器实现实例解析

    springboot日期转换器实现实例解析

    这篇文章主要介绍了springboot日期转换器实现实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringSecurity oAuth2.0的四种模式(小结)

    SpringSecurity oAuth2.0的四种模式(小结)

    本文主要介绍了SpringSecurity oAuth2.0的四种模式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java Filter 过滤器详细介绍及实例代码

    Java Filter 过滤器详细介绍及实例代码

    Filter也称之为过滤器,它是Servlet技术中最实用的技术,本文章WEB开发人员通过Filter技术,对web服务器管理的所有web资源进行拦截,从而实现一些特殊的功能,本文章将向大家介绍Java 中的 Filter 过滤器,需要的朋友可以参考一下
    2016-12-12
  • Java @SentinelResource全面介绍

    Java @SentinelResource全面介绍

    在实际应用过程中,我们可能需要限流的层面不仅限于接口。可能对于某个方法的调用限流,对于某个外部资源的调用限流等都希望做到控制。对此,我们需要学习使用@SentinelResource注解,灵活的定义控制资源以及如何配置控制策略
    2022-08-08
  • 关于Java中的顶层类修饰问题

    关于Java中的顶层类修饰问题

    这篇文章主要介绍了关于Java中的顶层类修饰问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java数据结构基础:循环链表和栈

    java数据结构基础:循环链表和栈

    这篇文章主要介绍了Java数据结构之循环链表、栈的实现方法,结合实例形式分析了Java数据结构中循环链表、栈、的功能、定义及使用方法,需要的朋友可以参考下
    2021-08-08
  • idea2017建立jsp工程及tomcat配置教程

    idea2017建立jsp工程及tomcat配置教程

    本文通过图文并茂的形式给大家介绍了idea2017建立jsp工程及tomcat等配置的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java修改PowerPoint幻灯片批注信息

    Java修改PowerPoint幻灯片批注信息

    这篇文章主要介绍了Java修改PowerPoint幻灯片批注信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • IDEA连接postgressql数据库操作

    IDEA连接postgressql数据库操作

    这篇文章主要介绍了IDEA连接postgressql数据库操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • springboot框架阿里开源低代码工具LowCodeEngine

    springboot框架阿里开源低代码工具LowCodeEngine

    这篇文章主要为大家介绍了springboot框架阿里开源低代码LowCodeEngine工具使用详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论