頂級域名和二級域名共享cookie及相互刪除cookie
阿新 • • 發佈:2018-12-29
在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不會生成。
+展開 -C# HttpCookie hc = new HttpCookie("abc", "123");
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無法生成。
+展開 -C# HttpCookie hc = new HttpCookie("abc", "123");
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,而不是頂級域名的。
+展開
-C#
HttpCookie hc = Request.Cookies["abc"];
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作為測試。
+展開 -HTML <%@ Page Language="C#" %>
<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>
設定cookie
非頂級域名,如二級域名或者三級域名,設定的cookie的domain只能為頂級域名或者二級域名或者三級域名本身,不能設定其他二級域名的cookie,否則cookie無法生成。
頂級域名只能設定domain為頂級域名,不能設定為二級域名或者三級域名,否則cookie無法生成。
如www.abc.com能設定domain為abc.com或者www.abc.com,但不能設定domain為news.abc.com,這樣cookie不會生成。
+展開 -C# HttpCookie hc = new HttpCookie("abc", "123");
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無法生成。
+展開 -C# HttpCookie hc = new HttpCookie("abc", "123");
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作為測試。
+展開 -HTML <%@ Page Language="C#" %>
<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>