AJAX报错跨域问题解析
什么是跨域?
跨域(Cross-origin)是指一个域下的文档或脚本尝试去请求另一个域下的资源,由于浏览器的同源策略(Same-origin policy),出于安全考虑,浏览器默认不允许跨域请求。

跨域请求的常见情况
- 不同域名请求:访问
http://www.example.com页面,然后请求http://www.another.com的资源。 - 不同协议请求:访问
http://www.example.com页面,然后请求https://www.another.com的资源。 - 不同端口请求:访问
http://www.example.com:8080页面,然后请求http://www.another.com:80的资源。
跨域请求的解决方案
JSONP(只支持GET请求):
- JSONP是一种“非官方”的跨域解决方案,它利用
<script>标签没有跨域限制的特性。 - 实现步骤:
- 在目标服务器上提供一个处理JSONP请求的接口,该接口接收一个回调函数名称作为参数。
- 在前端页面中创建一个
<script>标签,并设置其src属性为目标服务器的JSONP接口地址,同时将回调函数名称作为参数传递。 - 目标服务器在返回数据时,将回调函数名称作为函数名包裹JSON数据。
- JSONP是一种“非官方”的跨域解决方案,它利用
CORS(跨源资源共享):
- CORS是一种更为安全、规范的跨域解决方案。
- 实现步骤:
- 在目标服务器上设置HTTP响应头
Access-Control-Allow-Origin,允许指定域名或(表示所有域名)跨域访问。 - 根据需要,还可以设置其他响应头,如
Access-Control-Allow-Methods、Access-Control-Allow-Headers等。
- 在目标服务器上设置HTTP响应头
代理服务器:

- 在本地搭建一个代理服务器,将请求转发到目标服务器,然后返回给前端。
- 实现步骤:
- 搭建一个代理服务器,如使用Node.js的
http-proxy-middleware。 - 在前端页面中,将请求发送到代理服务器的地址,代理服务器再将请求转发到目标服务器。
- 搭建一个代理服务器,如使用Node.js的
示例代码
以下是一个使用CORS实现跨域请求的示例:
// 目标服务器(Node.js)
const express = require('express');
const app = express();
app.get('/data', (req, res) => {
res.header('Access-Control-Allow-Origin', '*'); // 允许所有域名跨域访问
res.json({ message: 'Hello, world!' });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
}); // 前端页面
fetch('http://localhost:3000/data')
.then(response => response.json())
.then(data => {
console.log(data.message); // 输出:Hello, world!
})
.catch(error => {
console.error('Error:', error);
}); FAQs
Q1:什么是同源策略? A1:同源策略是一种安全策略,它限制了从一个源加载的文档或脚本如何与另一个源的资源进行交互,这里的“源”是由协议、域名和端口组成的。
Q2:如何判断是否发生了跨域请求? A2:如果请求成功返回,但前端接收到的是错误信息,如“Cannot read property 'xxx' of undefined”,则很可能是发生了跨域请求,可以在控制台查看网络请求的响应头,检查是否存在Access-Control-Allow-Origin等跨域相关的响应头。


