在 Spring Boot 中使用 @CrossOrigin

Posted

技术标签:

【中文标题】在 Spring Boot 中使用 @CrossOrigin【英文标题】:Using @CrossOrigin in Spring Boot 【发布时间】:2016-01-20 10:00:02 【问题描述】:

我正在使用最新的 Spring Boot (1.2.7.RELEASE)。我想使用 org.springframework.web.bind.annotation 包中的 @CrossOrigin 注释,如 Spring 文档中的 CORS Support 部分所述。

我想我已经拥有了所有必要的依赖项(通过 Spring Boot 默认设置),但这令人困惑:CrossOrigin 未找到,即使来自同一个包的 RestController 之类的东西也可以工作!

Error:(8, 47) java: cannot find symbol
  symbol:   class CrossOrigin
  location: package org.springframework.web.bind.annotation

发生了什么事? CrossOrigin 是否已从 Spring-MVC 的更高版本中删除,还是我缺少一些依赖项?

pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.7.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

【问题讨论】:

【参考方案1】:

好吧,目前看来最新的 Spring Boot 版本 1.2.7.RELEASE 太旧了,无法拥有带有 CrossOrigin 的 Spring MVC 版本。 (Spring Boot 1.2.7 uses Spring version 4.1.8)。

我更新到最新的 Spring Boot 1.3 候选版本 (1.3.0.RC1) 并且可以正常工作:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RC1</version>
</parent>

还需要在pom.xml 中指定spring-milestones 存储库才能使用非发布版本。

<repositories>
    <repository>
        <id>spring-milestones</id>
        <url>http://repo.spring.io/milestone</url>
    </repository>
</repositories>

更新:覆盖 Spring 版本

正如 Stéphane Nicoll 指出的,使用 Spring 4.2.2 类(例如 CrossOrigin)的更简单方法是:

<properties> 
    <!-- ... -->
    <spring.version>4.2.2.RELEASE</spring.version>
</properties>

【讨论】:

如果您愿意,也可以将 Spring Boot 1.2.7 与 Spring Framework 4.2.2.RELEASE 一起使用。前向覆盖不是问题。请确保在迁移到 1.3 时删除覆盖 @StéphaneNic​​oll:谢谢!我应该使用哪个依赖项(groupId/artifactId)? (只是spring-web?还是spring-corespring-context 等?最简单的方法是什么?请参阅问题中的 pom.xml。) 顺便问一下,有没有一种简单的方法可以查看所有默认依赖项的哪些版本带有特定的 Spring Boot 版本?今天早些时候我很难找到该信息。 4.2.2.RELEASE 在评论中提出其他问题可能不是一个好主意...docs.spring.io/spring-boot/docs/1.2.7.RELEASE/reference/…【参考方案2】:

@CrossOrigin注解用于提供对跨域的支持,

也就是说,除了来自不同的域,我们也可以访问该服务

默认为真。

我们也可以跨域访问服务。

【讨论】:

以上是关于在 Spring Boot 中使用 @CrossOrigin的主要内容,如果未能解决你的问题,请参考以下文章

在 spring-boot 项目中使用 spring mvc xml 项目

Spring boot在Spring boot中Redis的使用

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何在 Spring Boot 中使用 @Transactional 注解

spring-boot实战09:Spring Boot中使用@Scheduled创建定时任务

在 spring-boot 中使用一个模板引擎渲染多个后缀