2008-12-31 27 views
22

Bạn không thể tìm thấy bất kỳ điều gì cụ thể cho tình huống này trực tuyến để tôi ... Tôi cần đặt/lấy cookie được lưu trữ tại "first.com" trong khi duyệt "second.com", tôi có toàn quyền truy cập "first.com" nhưng tôi chỉ có quyền truy cập javascript (có thể thao tác DOM như tôi muốn) trên "second.com".Bắt đặt cookie trên các tên miền khác nhau, với javascript hoặc khác

Cách tiếp cận đầu tiên của tôi là tạo iframe trên second.com (với js) đã tải một trang như "first.com/doAjax?setCookie=xxx" và đã thực hiện cuộc gọi ajax để nói "first.com/setCookie ? cookieData = xxx "sẽ đặt cookie trên" first.com "với dữ liệu mà chúng tôi đã truyền qua.

Điều đó khá có ích khi thiết lập cookie trên first.com từ second.com - để nhận cookie, về cơ bản tôi đã làm theo cùng một quy trình, tạo iframe đã tải "first.com/doAjax?getCookie" và điều đó sẽ thực hiện cuộc gọi ajax để nói "first.com/getCookie" sẽ đọc thông tin cookie trên first.com và trả về nó dưới dạng đối tượng JSON.

Vấn đề là tôi không thể đưa đối tượng cookie JSON đó trở lại "second.com" để tôi có thể đọc nó, có lẽ tôi chỉ có thể mang nó khi cuộc gọi Ajax hoàn tất bằng cách sử dụng "window.top" nhưng có vấn đề về thời gian vì nó không liên quan đến thời điểm iframe được tải. Tôi hy vọng tôi rõ ràng và đã tự hỏi nếu có một giải pháp dễ dàng hơn là điên này iframe-> ajax crap, cũng có vẻ như điều này thậm chí sẽ không làm việc để nhận được cookie trong SAFARI.

+0

Chỉ cần lưu ý rằng điều này thực sự không an toàn vì bất kỳ ai cũng có thể đặt và nhận cookie cho first.com –

+0

@Luca Và nếu người dùng đã tắt cookie của bên thứ ba, bạn thậm chí sẽ không thể đặt cookie trong iframe ngay từ đầu. – Pacerier

Trả lời

9

Bạn có thể đưa phần tử tập lệnh vào phần đầu của tài liệu bằng một cuộc gọi lại chuyển cookie bạn cần đến bất kỳ chức năng nào cần.

Cái gì như:

<script type="text/javascript"> 
    var newfile=document.createElement('script'); 
    newfile.setAttribute("type","text/javascript"); 
    newfile.setAttribute("src", 'http://first.com/doAjax?getCookie&callback=passCookie'); 
    document.getElementsByTagName("head")[0].appendChild(newfile); 
</script> 

Và first.com/doAjax?getCookie trang có thể làm điều này:

 passCookie({'name':'mycookie', 'value':'myvalue'}); 
+3

Rõ ràng phương pháp này chỉ hoạt động trong Firefox, tôi đã thử nghiệm trong Safari và IE6, cả hai dường như không thể đặt/nhận cookie ... –

+0

Tôi không thể sử dụng thẻ tập lệnh để đọc cookie từ miền khác, phải không? Tôi cần phải thực sự được trên first.com để thực sự đọc cookie của nó, tôi không thể chỉ cần thêm một thẻ script để second.com để có được cookieData ... do đó tôi cần phải sử dụng một khung nội tuyến, hoặc tôi không biết ... Có lẽ tôi không hiểu câu trả lời của bạn, hãy cho tôi biết. –

+0

Bạn không sử dụng kỹ thuật thẻ script để đọc các giá trị cookie, tập lệnh được đưa vào trang của bạn, do đó nó nằm trong cùng phạm vi và có thể gọi bất kỳ hàm nào trên second.com –

0

Đặt này PHP-File để first.com:

//readcookie.php  
echo $_COOKIE['cookiename']; 

Trên second.com, bạn có thể sử dụng javascript này để nhận giá trị:

function readCookieCallback() 
{ 
    if ((this.readyState == 4) && (this.status == 200)) 
    { 
    alert("the value of the cookie is: "+this.responseText); 
    } 
    else if ((this.readyState == 4) && (this.status != 200)) 
    { 
    //error... 
    } 
} 


function buttonClickOrAnything() 
{ 
    var refreshObject = new XMLHttpRequest(); 
    if (!refreshObject) 
    { 
    //IE6 or older 
    try 
    { 
     refreshObject = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
     try 
     { 
     refreshObject = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch (e) 
     { 
     return; 
     } 
    } 
    } 
    refreshObject.onreadystatechange = readCookieCallback; 
    refreshObject.open("GET", "http://www.first.com/readcookie.php"); 
    refreshObject.send(); 
} 

Kính trọng, Robert

+0

Im có thể TẢI cookie bằng phương pháp được cung cấp bởi Ryan Doherty, có vẻ như nó cũng thiết lập cookie trên hầu hết các trình duyệt ngoại trừ Safari. –

+1

Điều này không hiệu quả đối với tôi. Tôi đã nhận được phản hồi trong Chrome: XMLHttpRequest không thể tải https://second.com/test.php. Nguồn gốc https://first.com không được Access-Control-Allow-Origin cho phép. – Volomike

+0

Đó là vấn đề về CORS. Không liên quan đến vấn đề về cookie. – germs12

-2

Đối với cài đặt cookie bạn có thể thay đổi kịch bản của tôi như sau:

mới PHP-Script:

//writecookie.php 
setcookie($_GET['c'], $_GET['v']); 

Và JavaScript:

function buttonClickOrAnything() 
{ 
    var refreshObject = new XMLHttpRequest(); 
    if (!refreshObject) 
    { 
    //IE6 or older 
    try 
    { 
     refreshObject = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
     try 
     { 
     refreshObject = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch (e) 
     { 
     return; 
     } 
    } 
    } 
    refreshObject.open("GET", "http://www.first.com/writecookie.php?c=cookiename&v=cookievalue"); 
    refreshObject.send(); 
} 

Điều đó sẽ hoạt động trên tất cả các trình duyệt.

+4

Không, cuộc gọi ajax không được phép sử dụng tên miền chéo ... –

+0

@LucaMatteis ... miễn là CORS (http://dev.w3.org/2006/waf/access-control/) không được bật. – Stephan

Các vấn đề liên quan