CORS是否仅作用于JavaScript?如何简单复现跨域请求错误?
CORS相关问题解答
1. HTML锚点发起的GET请求是否不受CORS限制?
对,完全不受限制。HTML锚点(<a>标签)的跳转属于浏览器的原生导航行为,本质上和手动在地址栏输入URL跳转一致——浏览器的核心功能就是支持跨网站导航,所以这类请求不会触发CORS校验。
2. CORS是否仅适用于通过Fetch API等客户端JavaScript发起的编程式GET请求?
更准确的说法是:CORS规则管控的是浏览器环境下由JavaScript主动发起的跨域HTTP请求:
- 包含Fetch API、XMLHttpRequest这类编程式请求;
- 也包括
<script>、<img>、<link>这类标签的跨域资源加载(不过这类属于“简单请求”,浏览器有默认宽松规则,通常不会触发预请求,但如果服务器返回不允许的头,依然会被拦截)。
而浏览器原生的导航(a标签跳转、地址栏输入)、普通表单提交(跳转式的POST/GET)这类非JavaScript驱动的行为,都不在CORS的管控范围内。
3. 如何在简单环境中复现CORS错误?
作为后端开发者,不用复杂前端框架,纯HTML+JS就能快速复现:
- 第一步:用你的C++服务器在
localhost:8080启动服务,返回如下HTML页面:<!DOCTYPE html> <html> <body> <button onclick="testCrossDomain()">触发跨域请求</button> <script> function testCrossDomain() { // 请求另一个端口的API接口 fetch('http://localhost:8081/api/hello') .then(res => res.text()) .then(msg => alert('响应内容:' + msg)) .catch(err => alert('CORS错误:' + err.message)); } </script> </body> </html> - 第二步:在
localhost:8081启动另一个你的C++服务器,提供/api/hello接口,但不要添加任何CORS相关响应头(比如Access-Control-Allow-Origin)。 - 第三步:打开浏览器访问
http://localhost:8080,点击页面上的按钮。此时浏览器会通过JavaScript发起跨域Fetch请求,因为服务器8081没返回允许跨域的头,浏览器会直接拦截请求,并在开发者工具(F12)的控制台里抛出CORS错误——这就是你要复现的场景。
内容的提问来源于stack exchange,提问作者ddevienne
相关产品推荐
相关产品推荐

