JavaScript实现跨域访问的多种方案详解

作者:半夏

时间:2026-10-29

浏览:146

本文汇总了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);

    }

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章