Cookie跨域操作看來是個簡單的問題,因為只要指定Domain屬性為指定網站的根域名就能夠了.但是筆者在實際使用過程中卻碰到了一些問題,的確值得注意.
環境介紹
cookie在www主域名下創建,並寫入Domain屬性,如:(為方便調試以下程式碼皆為asp程式碼)
Write.asp
程式碼
<%
Response.Cookies(CookieName)("UserName") = "SunBird"
Response.Cookies(CookieName)("Password") = "xyz1234"
Response.Cookies(CookieName).Domain = "xxxx.com"
%>
上面文件放在www主網域下,同時在同目錄下放置一個讀取cookie的Read.asp
Read.asp
程式碼
<%
Response.Write Request.Cookies(CookieName)("UserName")
Response.Write Request.Cookies(CookieName)("Password")
%>
再放一個Read.asp文件到另外一個子網域網站裡,程式碼同上。最後我們再做一個清除cookie的Clear.asp放在主網域下
Clear.asp
程式碼
<%
Response.Cookies(CookieName)("UserName") = ""
Response.Cookies(CookieName)("Password") = ""
Response.Cookies(CookieName).Domain = "xxxx.com"
%>
現在能夠透過下面的執行順序來測試,Write.asp-->主網域的Read.asp-->子網域的Read.asp 任何Read.asp頁面都能夠讀取到Write.asp所建立的cookie的值,然後再執行Clear.asp進行清除,一切都Ok, http://bizhi.downcodes.com/看起來沒有什麼問題。
但是把這種方法運用到實際的站點時卻出現問題了。
問題描述:
第一次登入一切ok,任何子網域都能夠存取到主網域儲存的cookie,但是,一旦登出之後,子網域的cookie就被清除了,但是主網域的cookie仍然保留著,強行清除主網域的cookie之後,無論怎樣登入主網域下都無法儲存cookie了,除非關掉瀏覽器重新開啟。
經過多次嘗試後,無意中發現問題所在,以下是測試經過。
建立一個Write2.asp的頁面放在主網域下
程式碼
<%
Response.Cookies(CookieName)("TEST_COOKIE") = "TEST_COOKIE"
%>
第一步:關閉瀏覽器後,依下列順序執行,Write.asp-->主網域的Read.asp-->子網域的Read.asp 到這裡任何Read.asp讀取正常。
第二步:Clear.asp-->主網域的Read.asp-->子網域的Read.asp 到這裡清除操作是成功的。
步驟三:Write.asp--> Write2.asp --> 主網域Read.asp --> 子網域Read.asp 到這裡兩個Read.asp都能夠讀取到cookie的值。
第四步:重新執行第二步,發現主網域Read.asp仍然輸出了值,而子網域下的Read.asp的值已被清空了。
根據上述測試總結以下幾點再跨域使用cookie時需要注意的地方
1、當您有一個Cookie群組(或叫Cookie字典)使用Domain屬性指定網域之後,當您在對該群組的成員進行修改或新增的時候,一定要在操作之後加上Resonse.Cookies(CookieName).Domain屬性。
2.假如沒有必要,請不要修改已配置Domain的Cookie群組,直接使用Response.Cookies("CookieText") = CookieValue 來建立一個新的Cookie。