老生常談cookie跨域

很早之前就做過跨域設置cookie的項目了,但是以前沒有做好積累,今晚花了點時間重新複習一下。

OK,有兩個域名,www.a.com和www.b.com,現在要通過a網站來設置b網站下的cookie。

a網站下setcookie.php的代碼:

<html>
<head>
    <meta charset="utf-8" />
    <title>Cookie Cross Domain</title>
    <!--
    -->
    <script type="text/javascript" src="http://www.b.com/cookie/setcookie.php?name=world"></script>
</head>
<body>
    <h1>test</h1>
    <!--
    <iframe src="http://www.b.com/cookie/setcookie.php?name=hello"></iframe>
    -->
</body>
</html>

用JavaScript來調用或者用iframe調用都是沒有問題的。

下面是b網站的setcookie.php的代碼:

<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
$name = isset($_GET['name']) ? $_GET['name'] : "caiknife";
setcookie("name", $name, time()+3600, '/', '.b.com');

第一行的header函數是因爲IE瀏覽器下有嚴格的P3P安全驗證,所以需要發送這段header信息,FireFox下可以不用。

接下來,是b網站的getcookie.php的代碼:

<?php
if (isset($_GET['callback'])) {
    $callback = $_GET['callback'];
    echo $callback."(".json_encode($_COOKIE).")";
} else {
    echo json_encode($_COOKIE);
}

先別管if語句裏前面的代碼是什麼意思,我們直接訪問http://www.b.com/cookie/getcookie.php,就能看到結果:{"name":"world"},OK,cookie跨域設置成功!


接下來,是cookie跨域讀取,看看a網站的setcookie.php代碼:

<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
    $(function(){

    $.getJSON("http://www.b.com/cookie/getcookie.php?callback=?", function(data){
        $("p").html(data.name);
        // alert(data.name);
    });

    });
    </script>
</head>
<body>
    <p></p>
</body>
</html>

這裏callback=?,在jQuery的官方文檔裏是這麼解釋的:“在 jQuery 1.2 中,您可以通過使用JSONP形式的回調函數來加載其他網域的JSON數據,如 "myurl?callback=?"。jQuery 將自動替換 ? 爲正確的函數名,以執行回調函數。 注意:此行以後的代碼將在這個回調函數執行前執行。”。

現在訪問a網站的http://www.a.com/cookie/getcookie.php頁面,看到p標籤裏顯示了“world”,跨域cookie讀取成功!


以上代碼在FireFox 20.0,IE9下測試通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章