JavaScript实现跨域访问的多种方案详解
本文汇总了JavaScript中实现跨域数据交互的多种主流方法。从基于同源策略限制的JSONP原理,到利用jQuery简化异步请求;从服务端代理转发数据,到利用iframe隐藏通信,以及HTML5 WebSocket的全双工通信。详细解析各方案的实现代码与适用场景,帮助开发者根据实际需求选择最优跨域策略。
跨域访问基础与JSONP原理
受限于浏览器的同源策略,XMLHttpRequest对象默认只能请求当前源(即域名、协议和端口一致)的资源。
JSON与JSONP的核心区别:
JSON是一种标准化的数据交换格式,而JSONP则是一种由开发人员利用脚本特性实现的非官方跨域数据交互协议。
script标签常被用于加载不同域下的资源,从而绕过同源策略限制(任何具备src属性的标签均可获取异域文件)。若远程返回的数据是可执行的JavaScript代码,浏览器将直接执行这些代码,其效果等同于执行eval()。
方法一:
利用script标签发起请求(格式如:<script src="http://....jsp?callback=回调函数名"></script>)。在发起请求前,需先定义并声明好回调函数。
<script>
function 回调函数名(data数据){ 。。。。 }
</script>
<script src="http://....jsp?callback=回调函数名"></script>
通过JSON格式传递JavaScript对象是最简单的跨域通讯方式,这种机制被称为JSONP。远程服务器负责拼接字符串:回调函数名({"name1":"data1","name2":"data2"})。这种方式由后台拼接JSON数据,并通过回调函数传参的形式返回给客户端(相当于直接调用了已获取字符串的eval处理)。例如:function databack(data){ alert(data.name1) },这将输出显示“data1”。
jQuery简化跨域请求
方法二:
使用jQuery实现跨域加载更为简便,其方式与Ajax异步请求类似。
$.ajax({
type : "get",
dataType:"json",
success : function(data){ alert(data.name1) };
})
或者使用简写形式:var url = "http://.....jsp?callback=?";在jQuery中,此处的callback值可以是任意字符串,因为
jQuery内部处理后,均通过success回调函数接收数据;$.getJSON( url, function(data){ alert(data.name1) });
服务端代理方案
方法三:
Ajax跨域之服务端代理方案。在同源的后端设置一个代理程序(如proxy.jsp...),由服务器端与异域服务器进行交互。前台jQuery传输数据示例:
$.get(
'http://。。。.jsp', // 代理程序地址
{
name1 : "data1",
name2 : "data2"
},
function(data){
if(data == 1) alert('发送成功!');
}
);
后台数据处理逻辑:
String data1 = request.getParameter("name1");
........
// 此处的url为另一域下的地址并带有参数
String url = "http://.....com/.../sss.jsp?" + "name1=" + data1+ "name2=" +
data2;
// 跳转到另一个域进行数据的处理并返回json格式的数据
request.getRequestDispatcher(url).forward(request,response);
iframe跨域通信
方法四:
利用iframe标签的src属性进行跨域访问,将获取到的数据存储在当前的iframe中,然后
在同一页面中获取该iframe的body内的值。
<body>
<div id="show"></div>
<iframe id="frame" style="display: none;"></iframe>
</body>
<script>
$("#frame").attr("src", "路径?time=" + new Date().getTime()).load(function(){
// 获取iframe标签的值并进行获取,显示到页面
$("#show").append("[data: " + $($("#frame").get(0).contentDocument).find("body").text()
+ " ]");
});
</script>
HTML5 WebSocket跨域
方法五:
HTML5中的WebSocket支持跨域访问;创建一个websocket对象:
var ws = new WebSocket(url);
主要处理的事件类型包括(onopen、onclose、onmessage、onerror);
例如:
ws.onopen = function(){
console.log("open");
// 向后台发送数据
ws.send("open");
}
后台可以使用Java、PHP或Node.js等技术,通过onmessage事件处理返回的值,并在前端进行相应处理。
ws.onmessage = function(eve){
console.log(eve.data);
}
JavaScript闭包与类(Class)的区别及适用场景对比
2026-11-05 15:48:57
JavaScript入门要学ES6吗?let与箭头函数等新特性解析
2026-11-05 14:49:16
JavaScript 8种数据类型详解:基本类型与引用类型的区别
2026-11-05 14:25:15
怎么在JavaScript中使用async/await优化Ajax异步流程
2026-11-05 13:56:15
JavaScript replace回调函数实现动态正则替换逻辑
2026-11-05 13:52:13
