1. 程式人生 > >頂級域名和二級域名共享cookie及相互刪除cookie

頂級域名和二級域名共享cookie及相互刪除cookie

 在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