在CSDN看到一個cookie設置domain時,如何刪除的問題,
自己也只知道domain設置為頂級域名時可以被其他二級域名共享,但是如何刪除還是有一點搞不清楚,所以特意測試了下cookie和domain之間的關系,下面是一些測試結果的總結
設置cookie
非頂級域名,如二級域名或者三級域名,設置的cookie的domain只能為頂級域名或者二級域名或者三級域名本身,不能設置其他二級域名的cookie,否則cookie無法生成。
頂級域名只能設置domain為頂級域名,不能設置為二級域名或者三級域名,否則cookie無法生成。
如www.abc.com能設置domain為abc.com或者www.abc.com,但不能設置domain為news.abc.com,這樣cookie不會生成。
hc.Domain = "news.abc.com";//////
hc.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(hc);//==========這樣cookie無法生成
abc.com只能設置domain為abc.com,不能為www.abc.com等2級域名,如果設置為其他domain二級域名,cookie無法生成。
hc.Domain = "www.abc.com";///////////
hc.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(hc);//==========這樣cookie無法生成
未指定domain時,默認的domain為用哪個域名訪問就是哪個,如果為頂級域名訪問,那么可以被其他2級域名共享。
讀取cookie
二級域名能讀取設置了domain為頂級域名或者自身的cookie,不能讀取其他二級域名domain的cookie。所以要想cookie在多個二級域名中共享,需要設置domain為頂級域名,這樣就可以在所有二級域名里面或者到這個cookie的值了。
頂級域名只能獲取到domain設置為頂級域名的cookie,其他domain設置為二級域名的無法獲取。
刪除cookie
1)頂級域名的cookie在頂級域名或者2級域名都可以刪除,但是用非頂級域名訪問的網站要刪除頂級域名的cookie,需要設置獲取到的cookie的domain為頂級域名,這樣才能刪除頂級域名的cookie,否則無法刪除,默認的會刪除訪問的域名下對應的cookie,而不是頂級域名的。
if (hc != null)
{
hc.Domain = "abc.com";/////指定為頂級域名則可以在其他二級域名中刪除頂級域名的cookie,否則默認刪除的是本域名下的cookie
Response.Write("刪除域名Cookie!
");
hc.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(hc);
}
2)刪除2級域名自身生成的cookie不需要設置domain,可以直接刪除。
下面為完整的測試示例,大家自己可以測試一下,注意后面標注了/////////的代碼,這些是關鍵,也注意修改修改代碼中設置的域名,我這里為了方便,直接設置了系統hosts文件將abc.com作為測試。
<script runat="server">
private void SetCookie(string name,string value,string domain)
{
HttpCookie hc = new HttpCookie(name, value);
hc.Domain = domain;////////
hc.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(hc);
}
private void ReadCookie(string name)
{
HttpCookie hc = Request.Cookies[name];
if (hc != null) Response.Write("設置的Cookie為:" + hc.Value+"|"+hc.Domain);
else Response.Write("Cookie值為空!");
}
private void DeleteCookie(string name,string domain)
{
HttpCookie hc = Request.Cookies[name];
if (hc != null)
{
hc.Domain = domain;////////
Response.Write("刪除域名Cookie!
");
hc.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(hc);
}
}
protected void Page_Load(object sender, EventArgs e)
{
// SetCookie("abc", "abc.com--" + DateTime.Now.ToString(), "www.abc.com");
ReadCookie("abc");
// DeleteCookie("abc","abc.com");
}
script>
