一、什么是@CrossOrigin

@CrossOrigin 是 Spring Framework 提供的一个注解,用于在 REST 控制器中轻松启用跨源资源共享(CORS)。CORS 是一种安全机制,由浏览器实现,用于限制一个域上的网页与另一个域上的资源进行交互的能力。这种限制有助于防止恶意脚本从一个站点访问另一个站点的数据。

二、什么是跨域

当一个网站尝试从不同域名(或端口、协议)请求数据时,浏览器会阻止这种请求,这是一种安全措施。例如,如果一个网站运行在 example.com 上,并尝试从 api.example.org 获取数据,那么默认情况下,这种请求会被浏览器阻止。

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
所谓同源是指,域名,协议,端口均相同,举个栗子:

  • http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域)
  • http://123.com/index.html 调用http://456.com/server.php (主域名不同:123/456,跨域)
  • http://www.abc.123.com/index.html 调用 http://www.def.123.com/server.php(子域名不同:abc/def,跨域)
  • http://www.123.com:8080/index.html调用http://www.123.com:8081/server.php(端口不同:8080/8081,跨域)
  • http://www.123.com/index.html 调用 https://www.123.com/server.php(协议不同:http/https,跨域)

三、@CrossOrigin注解是干什么用的

@CrossOrigin是一个Java注解,用于指示浏览器允许跨域请求资源。在Web应用程序中,如果JavaScript代码试图从一个域名获取来自不同域名的资源,这将会触发浏览器的同源策略,从而导致浏览器阻止跨域请求。使用@CrossOrigin注解可以允许浏览器绕过同源策略,从而允许跨域请求。

@CrossOrigin注解可以用于类级别或方法级别,如果用于类级别,将适用于整个类中的所有方法。它接受一些参数,包括:

  • origins:指示允许跨域请求的来源。默认情况下,它是"*",表示允许来自任何来源的跨域请求。
  • methods:指示允许的HTTP方法。默认情况下,它包括GET、HEAD和POST。
  • maxAge:指示浏览器可以缓存预检请求的时间(以秒为单位)。
  • allowedHeaders:指示允许的请求头。
  • exposedHeaders:指示可以访问响应头的列表。

总之,使用@CrossOrigin注解可以解决跨域请求的问题,使得Web应用程序能够更灵活地使用跨域资源。

四、用法

在controller层接口上加上@CrossOrigin注解即可。

@RestController
public class MyController {

    // 允许所有来源的 GET 请求
    @CrossOrigin(origins = "*", allowedHeaders = "*", methods = RequestMethod.GET)
    @GetMapping("/public")
    public String getPublicResource() {
        return "This is a public resource";
    }

    // 允许 example.com 的 POST 请求,并且允许携带凭证
    @CrossOrigin(origins = "http://example.com", allowCredentials = "true")
    @PostMapping("/private")
    public String getPrivateResource() {
        return "This is a private resource";
    }
}

配置全局 CORS 支持

import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(false)
                .maxAge(3600);
    }
}

更多推荐