跨域访问与XMLHttpRequest
引言
在前端开发中,我们经常会遇到需要通过发送XMLHttpRequest
(以下简称XHR)请求来获取后端服务的数据。然而,由于同源策略的限制,XHR请求默认情况下只能发送到同一域名下的接口。那么,当我们需要请求不同域名下的接口时,就会遇到跨域访问的问题。本文将介绍跨域访问的概念以及解决方案,并以Access to XMLHttpRequest at 'file:///Users/mac126/Desktop/jquery-photos-mast
为例进行说明。
什么是跨域访问?
跨域访问(Cross-Origin Resource Sharing,简称CORS)是指在浏览器中,当前页面的域名与请求的资源所在的域名不一致时,浏览器会限制页面对该资源的访问。这是为了防止恶意网站获取其他域名下的数据,提高安全性。
同源策略
同源策略(Same-Origin Policy)是浏览器的一种安全策略,指的是页面中的脚本只能读取同源(协议、域名、端口相同)的数据。换句话说,如果当前页面的域名是`
解决方案
JSONP
JSONP(JSON with Padding)是一种跨域访问的解决方案,它利用<script>
元素可以跨域引用资源的特性。通过动态创建<script>
标签,将请求的数据作为回调函数的参数返回给页面。例如:
function handleResponse(data) {
console.log(data);
}
var script = document.createElement('script');
script.src = '
document.body.appendChild(script);
在上述代码中,我们动态创建了一个<script>
标签,并将请求的URL设置为`
代理服务器
另一种常见的解决方案是通过代理服务器转发请求。我们可以在同一域名下设置一个后端接口,接收前端发送的请求,并将请求转发到目标域名下的接口。这样,前端通过访问同一域名下的接口,间接实现了跨域访问。例如:
// 前端请求
xhr.open('GET', '/api');
xhr.send();
// 代理服务器转发请求
app.get('/api', function(req, res) {
// 转发请求到目标域名下的接口
http.get(' function(response) {
var body = '';
response.on('data', function(chunk) {
body += chunk;
});
response.on('end', function() {
res.send(body);
});
});
});
在上述代码中,前端通过发送请求/api
,代理服务器接收到请求后,将请求转发到`
CORS
CORS是官方推荐的解决方案,通过在服务器端设置响应头中的Access-Control-Allow-Origin
字段,允许指定的域名访问资源。服务器返回的响应头中包含Access-Control-Allow-Origin: *
或者`Access-Control-Allow-Origin:
// 服务器端设置响应头
res.setHeader('Access-Control-Allow-Origin', '
在上述代码中,服务器将响应头中的Access-Control-Allow-Origin
字段设置为`
以示例说明
根据提供的示例Access to XMLHttpRequest at 'file:///Users/mac126/Desktop/jquery-photos-mast
,