返回

SpringBoot 跨域访问 CORS & @CrossOrigin 详解

后端

跨域访问:深入解析 CORS 和 SpringBoot 中的 @CrossOrigin

跨域访问的困境

当今的网络世界中,跨域访问已成为开发人员经常面临的难题。跨域访问是指从一个域名的网页向另一个域名下的资源发起请求。然而,由于浏览器的同源策略限制,跨域访问往往被浏览器阻止,从而导致前端无法获取后端数据。

CORS 的救赎

跨域资源共享 (CORS) 是一种解决跨域访问的规范,它允许不同来源的客户端与服务器之间共享资源。通过在服务器端设置响应头,CORS 指定了允许哪些来源的客户端访问资源,以及允许客户端使用哪些请求方法和请求头。

SpringBoot 中的 @CrossOrigin

SpringBoot 提供了 @CrossOrigin 注解,让开发者轻松解决跨域问题。@CrossOrigin 可以添加到控制器类或控制器方法上,以指定允许跨域访问的来源、请求方法、请求头等。

示例:

@RestController
@CrossOrigin(origins = "http://localhost:8080")
public class MyController {

    @GetMapping("/api/data")
    public List<String> getData() {
        return Arrays.asList("A", "B", "C");
    }
}

上面的代码表示允许来自 http://localhost:8080 的跨域访问。如果需要允许所有来源的跨域访问,可以使用 origins = "*"

浏览器的端口默认号

在跨域访问中,浏览器的协议默认端口号也需考虑。HTTP 的默认端口号为 80,HTTPS 的默认端口号为 443。如果后端服务器的端口号不是默认端口号,则需要在 @CrossOrigin 注解中指定端口号。

示例:

@RestController
@CrossOrigin(origins = "http://localhost:8081")
public class MyController {

    @GetMapping("/api/data")
    public List<String> getData() {
        return Arrays.asList("A", "B", "C");
    }
}

该代码表示允许来自 http://localhost:8081 的跨域访问。

总结

跨域访问可以通过 CORS 和 SpringBoot 中的 @CrossOrigin 注解得到有效解决。在使用 @CrossOrigin 注解时,需要考虑浏览器的协议默认端口号,并根据需要指定端口号。

常见问题解答

1. 如何允许所有来源的跨域访问?
使用 @CrossOrigin(origins = "*")

2. 如何指定允许的请求方法?
使用 @CrossOrigin(methods = {RequestMethod.GET, RequestMethod.POST})

3. 如何指定允许的请求头?
使用 @CrossOrigin(allowedHeaders = {"Content-Type"})

4. 如何配置最大预检请求时间?
使用 @CrossOrigin(maxAge = 3600)

5. 为什么在使用跨域访问时遇到 OPTIONS 请求?
OPTIONS 请求是浏览器发起的预检请求,用于检查服务器是否允许跨域访问。