1. 程式人生 > >jsonp實現跨域讀寫cookie

jsonp實現跨域讀寫cookie

javascript是無法跨域讀寫cookie的,如果想在其他域寫cookie一般可以隱藏一個iframe去訪問這個域,讓它來寫入,jsonp提供給我們一個更好的選擇,可以通過它來實現跨域操作

1、寫cookie(以jquery實現)

有兩個web,域名分別是a.com、b.com,現在希望在a.com操作寫入b.com的cookie(當然a.com也無法通過正常的方式讀到這個cookie,這樣可以讓b.com讀到);

a.com中set.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>跨域設定b.com中cookie</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" charset="utf-8" src="jquery-1.9.1.min.js"></script>
<body>
<script type="text/javascript">
$(document).ready(function(){
        $.ajax({
             
url:'http://b.com/setcookie.php',
dataType:"jsonp", jsonp:"jsonpcallback", success:function(data){ alert(data.res); } }); }); </script> </body>

 b.com中setcookie.php:(正常設定cookie)

  <?php
  $callback = $_GET['jsonpcallback'];
  setcookie("Q",time(),0,"/");
  //為了知道處理結果可以返回其他資訊


這時訪問a.com/set.php,再看一下b.com下的cookie是不是有了Q?

2、讀cookie

同樣a.com中讀取b.com的cookie

a.com中get.php與設定的set.php相同

b.com中getcookie.php:

$callback = $_GET['jsonpcallback'];
$cookie = json_encode($_COOKIE);
echo $callback."(".$cookie.")";

為什麼要跨域讀寫cookie呢?說一個常見的應用場景:單點登入(sso)

單點登入簡單的說就是有多個系統,域名可能不同,但是共享同一套會員體系,在任何一個系統登入後在其他系統都同步登入。

比如天貓(tmall.com)、淘寶(taobao.com)、阿里巴巴(1688.com)這三個網站,如果我在淘寶登入了,當我再開啟天貓、阿里巴巴時也是預設登入的

一般每個子系統都是單獨驗證使用者資訊的,但是系統多了為了更好的體驗就需要同步登入,解決這種問題的做法是單獨出使用者體系,所有的子系統使用者的登入、退出都在這個會員中心進行

仍然以阿里為例,假設其會員中心為user.alibaba.com,當在淘寶登入時會去會員中心驗證使用者資訊,驗證通過則返回使用者資訊,同時在user.alibaba.com中設定登入資訊的cookie(比如user_id=123456)這一步就是跨域寫cookie,當淘寶需要檢查使用者是否登入時也要在會員中心進行,驗證時需要根據cookie資訊,但是包含登入資訊的cookie在user.alibaba.com域下,所以需要跨域讀cookie

除了同步登入統一的會員驗證中心也解決了多臺伺服器驗證的問題