步驟:
1、在iis新建站點3個
www.goalercn.com(和goalercn.com),img.goalercn.com,blog.goalercn.com
2、在www.goalercn.com下建立文件testcookies.asp,代碼如下:
<%
Response.Cookies("Type") = "Test Cookies"
Response.Cookies("Type").Expires = date()+30
Response.Cookies("Type").Domain = ".goalercn.com"
Response.Cookies("Type").Secure = False
Response.Write Request.Cookies("Type")
%>
3、在ad.goalercn.com下建立文件testcookies.asp,代碼如下:
<%Response.Write Request.Cookies("Type")%>
4、在blog.goalercn.com下建立文件testcookies.asp,代碼同上
5、因爲是本機測試,修改hosts文件,把4個域名都指向到127.0.0.1,也就是添加如下內容:
127.0.0.1 ad.goalercn.com
127.0.0.1 blog.goalercn.com
127.0.0.1 www.goalercn.com
127.0.0.1 goalercn.com
6、關閉所有瀏覽器,開ie,打開http://www.goalercn.com/demo/testcookies.asp,顯示出文本內容:Test Cookies
7、新建窗口,打開http://ad.goalercn.com/temp/testcookies.asp,顯示出文本內容:Test Cookies
8、新建窗口,打開http://blog.goalercn.com/temp/testcookies.asp,同樣顯示出如上文本內容
9、換其他4個瀏覽器,都成功。
注意點:
1、Response.Cookies("Type").Secure = False,Secure屬性一定要是false,或者直接不執行這行,如果Secure = True,則ad和blog的2級域名是取值不了。
2、Response.Cookies("Type").Domain = ".goalercn.com",domain的值,我設置爲"goalercn.com",也就是沒有前面的點,在IE下成功
其他4個瀏覽器沒測試。
3、path我猜是不應該設置的。
4、在局域網內其他機器上,修改host指向到我機器的IP,取值成功。
5、在局域網另外一臺機器上架設ad.goalercn.com,把testcookies.asp文件copy過去,同時修改host到當前機器,取值成功
Cookie跨域操作解決方案Cookie跨域操作
看來是個簡單的問題,因爲只要指定Domain屬性爲指定網站的根域名就可以了.
但是筆者在實際使用過程中卻遇到了一些問題,的確值得注意.
環境介紹
cookie在www主域名下創建,並寫入Domain屬性,如:(爲方便調試以下代碼皆爲asp代碼)
Code:
Write.asp
<%
Response.Cookies(CookieName)("UserName") = "SunBird"
Response.Cookies(CookieName)("Password") = "xyz1234"
Response.Cookies(CookieName).Domain = "xxxx.com"
%>
上面文件放在www主域名下,同時在同目錄下放置一個讀取cookie的Read.asp
Code:
Read.asp
<%
Response.Write Request.Cookies(CookieName)("UserName")
Response.Write Request.Cookies(CookieName)("Password")
%>
再放一個Read.asp文件到另外一個子域名站點裏,代碼同上。
最後我們再做一個清除cookie的Clear.asp放在主域名下
Code:
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,看上去沒有什麼問題。
但是把這種方法運用到實際的站點時卻出現問題了。
問題描述:
第一次登錄一切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。
===========================
刪除cookie:
1、
設爲空值
HttpCookie cookieUserID=new HttpCookie("UserID","");
2、
直接清除
this.Response.Cookies.Clear();
3/
<%
For Each cookie in Request.Cookies
Response.Cookies(cookie)=""
Next%>