SpringBoot 跨域访问 CORS & @CrossOrigin 详解
2022-12-05 19:27:20
跨域访问:深入解析 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 请求是浏览器发起的预检请求,用于检查服务器是否允许跨域访问。