很早之前就做過跨域設置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下測試通過。