2009-11-05 88 views
0

我正在創建一個分析項目。我的目標是給我的網站的x域的所有者少量的JavaScript包括。這讓我有能力追蹤他們的鼠標移動。我得到了追蹤,我需要做的就是將數據發回我的服務器,以便它可以存儲在我的數據庫中。我的問題是數據太大,無法通過getJSON發送。從外部域檢索數據

請記住.. 我不能使用$ .Post或任何種類的XMLhttp請求,因爲我的域和x域是REMOTE。和瀏覽器不允許..我只能使用getJSON。

由於這不起作用,我被告知設置代理。從我所瞭解到的情況來看,代理服務器只適用於具有代理設置的服務器。不是試圖向我發送數據的服務器

我知道這是可能的,因爲我看到它。有人有主意嗎 ?? iframes對我所要做的事很好嗎?有沒有人有任何資源分享?

非常感謝

回答

0

您可以讓JavaScript創建一個iframe和一個表單,然後將表單發佈到iframe中。你可以將它定位在屏幕外面以隱藏。例如:

function post_my_data(json){ 

    var f = document.createElement('form'); 
    f.action = 'http://www.my-domain.com/receive.php'; 
    f.method = 'post'; 
    f.target = 'posttarget'; 

    var i = document.createElement('input'); 
    i.type = 'hidden'; 
    i.name = 'json'; 
    i.value = json; 

    f.appendChild(i); 

    var ifr = document.createElement('iframe'); 
    ifr.name = 'posttarget'; 
    ifr.style.display = 'absolute'; 
    ifr.style.left = '-1000px'; 

    document.body.appendChild(ifr); 
    document.body.appendChild(f); 

    f.submit(); 
} 
+0

我聽說過iframe,但我不知道從哪裏開始。我認爲這會幫助我很多。不知道它是否會起作用。但它似乎是一個好開始。 thanx很多 – numerical25 2009-11-06 15:51:09

+0

如果你知道任何其他偉大的例子,也許是一本書或URL你可以引薦我,請做和thanx – numerical25 2009-11-06 15:57:41

+0

有大量的點擊,如果你谷歌「使用隱藏的形式發佈數據跨域」,例如。 http://w-shadow.com/blog/2008/11/20/cross-domain-post-with-javascript/,但技術非常簡單。缺點是你無法從帖子中取回任何數據,所以它只是一個單向流。 – Cal 2009-11-07 21:54:36

0

你有沒有考慮使用類似JSONP

0

將數據分塊,以便getJSON可以工作。您可以實施數據排隊,以便生產者不斷填充包含數據的隊列,並且您的域上的消費者通過getJSON將其更小。它不會是實時的,但你可以試試看看你的表現是否合適。

+0

這似乎是合理的。但是我確實在想這件事。但如果我這樣做。我將不得不讓我的服務器知道每個請求都來自同一個會話。如果我不這樣做,它可能會在數據庫中插入一個新行,用於傳遞每個數據。我將不得不通過發送一個cookie來確定它來自同一個會話。這似乎是合理的。 – numerical25 2009-11-05 20:55:53

+0

或者在客戶端生成一個(半)唯一的ID併發送與所有部分相同的ID。服務器然後可以連接具有相同ID的部分。 – Wim 2009-11-05 21:13:47

0

您可以使用JavaScript來談談閃光,有閃光做跨域部分看到http://www.xml.com/pub/a/2006/06/28/flashxmlhttprequest-proxy-to-the-rescue.html

我不是你爲什麼不能使用代理明確。瀏覽器中的JavaScript發佈到在x域中運行的腳本,然後該腳本使用curl或類似方式將完全相同的信息發佈到您的域。

+0

我也不確定。假設php文件不是用於收入Ajax調用,而是用於傳出。我在我的服務器上使用它在Google等網站上嘗試過它,它工作正常。但我嘗試使用它從一個x域進來,它沒有。 – numerical25 2009-11-06 15:59:18

+0

所以問題不在於代理的概念,而在於特定的實現?也許我們可以幫助你解決這個問題。 – dsas 2009-11-07 11:31:53

0

也許你可以更好地理解它,那麼我可以。我很擅長php,但不擅長髮送不同的標題和內容。它的工作原理是將一個ajax帖子發佈到代理文件中。代理文件位於之外服務器上

  $.ajax({ 
     type: "POST", 
     url: "http://mywebsite.com/ajax-proxy.php", 
     data: 'csurl=www.google.com', 
     error: function(e) {console.log(e);}, 
     success: function(msg){console.log(msg)} 

    }); 

你也得通過csurl這是URL,代理你轉發給。在這個例子中我使用谷歌。但我會爲csurl正常使用是目錄的地方,我將存儲AJAX數據

在代理文件中,有一個

$valid_requests = array() 

在該數組,你的國家,你想要的所有網址代理商要批准。在這個例子中,你把www.google.com(注意:必須是完全一樣csurl參數,或者它不會工作)

下面是代理文件

<?php 
/** 
* AJAX Cross Domain (PHP) Proxy 0.6 
* by Iacovos Constantinou (http://www.iacons.net) 
* 
* Released under CC-GNU GPL 
*/ 

/** 
* Enables or disables filtering for cross domain requests. 
* Recommended value: true, for security reasons 
*/ 
define('CSAJAX_FILTERS', true); 


/** 
* A set of valid cross domain requests 
*/ 
$valid_requests = array(
    'www.google.com' 
); 

/*** STOP EDITING HERE UNLESS YOU KNOW WHAT YOU ARE DOING ***/ 

// identify request headers 
$request_headers = array(); 
foreach ($_SERVER as $key=>$value) { 
    if(substr($key, 0, 5) == 'HTTP_') { 
     $headername = str_replace('_', ' ', substr($key, 5)); 
     $headername = str_replace(' ', '-', ucwords(strtolower($headername))); 
     $request_headers[$headername] = $value; 
    } 
} 

// identify request method, url and params 
$request_method = $_SERVER['REQUEST_METHOD']; 
$request_params = ($request_method == 'GET') ? $_GET : $_POST; 
$request_url = urldecode($request_params['csurl']); 
$p_request_url = parse_url($request_url); 
unset($request_params['csurl']); 

// ignore requests for proxy :) 
if (preg_match('!'. $_SERVER['SCRIPT_NAME'] .'!', $request_url) || empty($request_url)) { 
    exit; 
} 

// check against valid requests 
if (CSAJAX_FILTERS) { 
    $parsed  = $p_request_url; 
    $check_url = isset($parsed['scheme']) ? $parsed['scheme'] .'://' : ''; 
    $check_url .= isset($parsed['user']) ? $parsed['user'] . ($parsed['pass'] ? ':'. $parsed['pass']:'') .'@' : ''; 
    $check_url .= isset($parsed['host']) ? $parsed['host'] : ''; 
    $check_url .= isset($parsed['port']) ? ':'.$parsed['port'] : ''; 
    $check_url .= isset($parsed['path']) ? $parsed['path'] : ''; 
    if (!in_array($check_url, $valid_requests)) { 
     exit; 
    } 
} 

// append query string for GET requests 
if ($request_method == 'GET' && count($request_params) > 0 && (!array_key_exists('query', $p_request_url) || empty($p_request_url['query']))) { 
    $request_url .= '?'. http_build_query($request_params); 
} 

// let the request begin 
$ch = curl_init($request_url); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);   // (re-)send headers 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     // return response 
curl_setopt($ch, CURLOPT_HEADER, true);       // enabled response headers 

// add post data for POST requests 
if ($request_method == 'POST') { 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request_params)); 
} 

// retrieve response (headers and content) 
$response = curl_exec($ch); 
curl_close($ch); 

// split response to header and content 
list($response_headers, $response_content) = preg_split('/(\r\n){2}/', $response, 2); 

// (re-)send the headers 
$response_headers = preg_split('/(\r\n){1}/', $response_headers); 
foreach ($response_headers as $key => $response_header) 
    if (!preg_match('/^(Transfer-Encoding):/', $response_header)) 
     header($response_header); 

// finally, output the content 
print($response_content); 
?> 

同樣,如果我把http://mywebsite.com/ajax-proxy.php?csurl=www.google.com從在我的網站內。它工作正常。甚至把它放在網址中。工作正常。但如果你使用ajax post從外部服務器調用它。不工作。