跨域是指浏览器为了安全起见,不允许一个域名的页面访问另一个域名的资源。原生JavaScript跨域主要有以下几种方式:
基础概念:JSONP 是一种通过 script 标签获取跨域数据的方法。
优势:兼容性好,支持老的浏览器。
应用场景:适用于 GET 请求。
示例代码:
<script>
function handleResponse(response) {
console.log('跨域数据:', response);
}
</script>
<script src="http://example.com/data?callback=handleResponse"></script>
基础概念:CORS 是一种现代浏览器支持的跨域解决方案,通过在服务器端设置 HTTP 响应头来允许跨域请求。
优势:支持各种请求方法,安全可靠。
应用场景:适用于所有类型的 HTTP 请求。
服务器端设置示例(Node.js Express):
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*'); // 允许所有域
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
app.get('/data', (req, res) => {
res.json({ message: '这是跨域数据' });
});
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});
基础概念:通过在服务器端设置一个代理,前端请求先发送到同源的代理服务器,然后由代理服务器转发请求到目标服务器。
优势:完全绕过了浏览器的同源策略限制。
应用场景:适用于开发环境或需要更复杂控制的场景。
示例代码(Node.js http-proxy-middleware):
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
app.use('/api', createProxyMiddleware({
target: 'http://example.com',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}));
app.listen(3000, () => {
console.log('代理服务器运行在 http://localhost:3000');
});
基础概念:WebSocket 是一种支持跨域的通信协议,可以在客户端和服务器之间建立持久连接。
优势:实时双向通信,不受同源策略限制。
应用场景:适用于实时通信应用,如在线聊天、实时数据更新等。
示例代码:
const socket = new WebSocket('ws://example.com/socketserver');
socket.onopen = function() {
console.log('连接成功');
socket.send('Hello Server!');
};
socket.onmessage = function(event) {
console.log('收到消息:', event.data);
};
基础概念:通过设置 document.domain 来实现同一主域下的跨域访问。
优势:简单易用。
应用场景:适用于同一主域下的子域名之间。
示例代码:
// 在两个不同子域名的页面中设置相同的 document.domain
document.domain = 'example.com';
选择哪种跨域方式取决于具体的应用场景和需求。JSONP 和 CORS 是最常用的两种方式,而代理服务器和 WebSocket 则适用于更复杂的场景。
领取专属 10元无门槛券
手把手带您无忧上云