跨域问题指的是浏览器从一个域请求数据,而该数据属于另一个域。出于安全考虑,浏览器会限制从一个域加载的脚本与另一个域的数据进行交互。
解决跨域问题的常用方法有:
- CORS(跨域资源共享):在服务器设置Access-Control-Allow-Origin,允许指定域跨域访问。
- JSONP:通过script标签的src引入跨域JSON数据,以函数回调的形式访问数据。
- 代理:通过代理服务器转发请求至跨域服务器,再返回数据至本地。
- postMessage:在两个页面中通过postMessage方法交换数据,必须同源或在白名单中。
代码示例:
CORS跨域:
服务端:
// Access-Control-Allow-Origin: * 允许所有域访问
// Access-Control-Allow-Origin: http://example.com 允许指定域访问
header('Access-Control-Allow-Origin: *');
客户端:
js
$.ajax({
url: 'http://api.example.com/test',
success: function(data) {
console.log(data);
}
});
JSONP跨域:
服务端:
// 返回 JSONP 格式数据
echo $_GET['callback'] . '(' . json_encode($data) . ')';
客户端:
js
$.ajax({
url: 'http://api.example.com/test?callback=showData',
dataType: 'jsonp',
success: function(data) {
console.log(data);
}
});
代理跨域:
客户端:
js
$.ajax({
url: '/proxy?url=http://api.example.com/test',
success: function(data) {
console.log(data);
}
});
代理服务器收到请求,转发至跨域API并返回响应。