需要异步地将数据从一个网站发送到另一个网站

时间:2012-02-09 15:00:22

标签: javascript jquery ajax

我的脚本跟踪客户端页面上的点击并将其上传到我的服务器(让我们称之为.http://fancyclickserver23.net)

现在我希望客户端在他的网站上放置一个脚本,这个脚本会标记页面上的点击,并在页面休假或甚至不时发送数据到.http://fancyclickserver23.net。 / p>

由于跨浏览器限制,我无法使用Ajax。那我该怎么做? 我会给出一些假设的代码来帮助你理解。 我有一个闭包跟踪器,在用户输入

时加载
<script src="http://fancyclickserver23.net/loadtracker.php?client_id=2332"></script>

代码加载闭包跟踪器= function(){....};   用户需要创建跟踪器对象

<script>
track=new tracker();
track.init();
</script>

track.init()基本上绑定一个获取元素Xpath并将其存储在track.clicks中的函数。现在我需要一个函数track.send(),它将点击数组作为json发送(我知道如何将它转换为json)并在页面关闭时发送它。

我该怎么做我也看到一些网站使用类似的东西:

 document.write("<sc"+"ript"+" src='https://fancyclickserver23.net/loadtracker.php?client_id=2332'"+"></scr"+"ipt>";

为什么要这样做而不是直接的脚本标记?如果我们必须使用document.write(),为什么不将它放在一个字符串中。

所以这两个问题是:

  1. 如何在页面加载时异步(或其他方式)发送数据?
  2. 上面的代码是做什么用的?
  3. 我看过谷歌分析和Facebook这样做,他们似乎没有任何问题。 Facebook infact在屏幕上呈现对话框。怎么样?

5 个答案:

答案 0 :(得分:3)

使用:

function sendData( data ){
  var scr = document.getElementById("scriptExchange");
  if(typeof scr == "undefined"){
     var scr=document.createEelement("script");
     scr.id="scriptExchange";
     document.body.appendChild(scr);
     scr = document.getElementById("scriptExchange");
  }
  scr.src = "http://another-website.com/?query="+data;

}

每当你想发送数据时,都要调用这个功能。 。

现在在另一台服务器上设置对纯JS代码的响应,例如。

alert("Data Received");

并从其他服务器中放入

答案 1 :(得分:3)

尽管存在跨域安全限制,您仍可以在某种程度上使用AJAX(XHR)。

浏览器无法像这样删除跨域请求。它必须先看看服务器对它的看法。它通过将实际请求发送到服务器并接收指令以及HTTP头中的响应来完成此操作。如果Access-Control-Allow-Origin标头未到达或与原始域不匹配,浏览器会删除响应并在控制台中抛出安全警告。

根据我的个人经验,Access-Control-Allow-Origin标题,当网站 aaa.com 向网站 bbb.com 发送AJAX请求时单向投放无论如何,数据有效负载发生在服务器上。这只是一个独白,但更需要收集数据,对吧? ;)

例如,我使用单向技术处理与您类似的事情 - 我收集了我的开源项目unit testshere结果的JSON报告。您可以在控制台中发现安全警告,但此时报告已经安全地存储在服务器上。

答案 2 :(得分:1)

如果您可以将点击数据数组转换为查询字符串,则可以执行以下操作:

var img = new Image(1,1);
img.src = "http://example.com/clicks-receiver?" + query_string;

答案 3 :(得分:1)

您可以使用jQuery和jsonP来实现此目的。

1)进行Ajax调用如下:

var url = your_other_domain_url + "jsoncallback=?";
var params = {param1:val1, param2:val2};
$.ajax({
  type: 'POST',
  url: url,
  data: params,
  success: function(data){
            //success jsonp handler - assume content in data.response
            if(data.response){
               //do something with the remote site content
            }
  },
  dataType: "json"
});

2)在服务器端,跟踪任何具有参数'jsoncallback'的请求,并将响应放在json返回对象中,如

{status: 'success', response: "<html>.....resposne conent...</html>"}

答案 4 :(得分:0)

是否可以使用iframe。父级可以看到iframe,iframe可以将脚本运行回另一台服务器而不会跳过一堆篮球。我相信我们的omniture实现使用了这种方法。

如上所述的img方法也是一种潜力。

关于它的旧文章:

http://www.codecouch.com/2008/10/cross-site-scripting-xss-using-iframes/

或其他

http://blog.kotowicz.net/2010/11/xss-track-how-to-quietly-track-whole.html

传播这些东西是不好的形式?