1. 程式人生 > >Cookie的屬性和跨域問題

Cookie的屬性和跨域問題

一、Cookie的屬性

一個域名下面可能存在著很多個cookie物件,cookie具有多個屬性:

  • name欄位為一個cookie的名稱

  • value欄位為一個cookie的值

  • domain欄位為可以訪問此cookie的域名,Servlet中通過setDomain()設定

非頂級域名,如二級域名或者三級域名,設定的cookie的domain只能為頂級域名或者二級域名或者三級域名本身,不能設定其他二級域名的cookie,否則cookie無法生成。

頂級域名只能設定domain為頂級域名,不能設定為二級域名或者三級域名,否則cookie無法生成。

二級域名能讀取設定了domain為頂級域名或者自身的cookie,不能讀取其他二級域名domain的cookie。所以要想cookie在多個二級域名中共享,需要設定domain為頂級域名,這樣就可以在所有二級域名裡面或者到這個cookie的值了。
頂級域名只能獲取到domain設定為頂級域名的cookie,其他domain設定為二級域名的無法獲取。

  • path欄位為可以訪問此cookie的頁面路徑。 比如domain是abc.com,path是/test,那麼只有/test路徑下的頁面可以讀取此cookie。Servlet中通過setPath()設定,"/"表示根路徑

  • expires/Max-Age 欄位為此cookie超時時間。若設定其值為一個時間,那麼當到達此時間後,此cookie失效。不設定的話預設值是Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標籤頁,而是整個瀏覽器) 後,此cookie失效。

  • size欄位 此cookie大小。

  • http欄位 cookie的http only屬性。若此屬性為true,則只有在http請求頭中會帶有此cookie的資訊,而不能通過document.cookie來訪問此cookie。

  • secure 欄位 設定是否只能通過https來傳遞此條cookie

二、Cookie的路徑

我們知道Cookie的屬性有很多,其中有一個屬性是路徑。有些人認為Cookie的路徑指的是Cookie在客戶端的儲存路徑,其實並不是。Cookie的路徑是在伺服器建立Cookie時設定的,它的作用是決定瀏覽器訪問伺服器的某個資源時,需要將瀏覽器端儲存的那些Cookie歸還給伺服器

三、Cookie跨域setDomain和setPath

正常的cookie只能在一個應用中共享,即一個cookie只能由建立它的應用獲得。

1.可在同一應用伺服器內共享方法:

設定cookie.setPath("/"); 假設本機tomcat/webapp下面有兩個應用:cas和webapp_b:

  • 1)原來在cas下面設定的cookie,在webapp_b下面獲取不到,path預設是產生cookie的應用的路徑。

  • 2)若在cas下面設定cookie的時候,增加一條cookie.setPath("/");或者cookie.setPath("/webapp_b/");就可以在webapp_b下面獲取到cas設定的cookie了。

  • 3)此處的引數,是相對於應用伺服器存放應用的資料夾的根目錄而言的(比如tomcat下面的webapp),因此cookie.setPath("/");之後,可以在webapp資料夾下的所有應用共享cookie,而cookie.setPath("/webapp_b/");是指cas應用設定的cookie只能在webapp_b應用下的獲得,即便是產生這個cookie的cas應用也不可以。

  • 4)設定cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的時候,只有在webapp_b/jsp下面可以獲得cookie,在webapp_b下面但是在jsp資料夾外的都不能獲得cookie。

  • 5)設定cookie.setPath("/webapp_b");,是指在webapp_b下面才可以使用cookie,這樣就不可以在產生cookie的應用cas下面獲取cookie了

  • 6)有多條cookie.setPath("XXX");語句的時候,起作用的以最後一條為準。

2.跨域共享cookie的方法:

設定cookie.setDomain(".jszx.com");假設 A機所在的域:home.langchao.com,A有應用cas B機所在的域:jszx.com,B有應用webapp_b :

  • 1)在cas下面設定cookie的時候,增加cookie.setDomain(".jszx.com"),這樣在webapp_b下面就可以取到cookie。

  • 2)這個引數必須以“.”開始。

  • 4)設定了cookie.setDomain(".jszx.com");,還可以在預設的home.langchao.com下面共享。