關於ASP.NET/C#中對Cookie的讀寫操作、跨域Cookies的刪除

2012041010:39

            HttpCookie cookie = new HttpCookie("Info");    //定義cookie對象以及名為Info的項
            DateTime dt = DateTime.Now;                    //定義時間對象
            TimeSpan ts = new TimeSpan(1, 0, 0, 0);        //cookie有效作用時間,具體查msdn
            cookie.Expires = dt.Add(ts);                   //增加作用時間
            cookie.Values.Add("user", "coolong");          //增加屬性
            cookie.Values.Add("userid", "1203");
            Response.AppendCookie(cookie);                 //確定寫入cookie中

            if (Request.Cookies["Info"] != null)
            {
                //讀全部
                string temp = Convert.ToString(Request.Cookies["Info"].Value);
                //讀子項目
                //string temp = Convert.ToString(Request.Cookies["Info"].Values["user"]) + " " + Convert.ToString(Request.Cookies["Info"].Values["userid"]);

                if (temp == "")
                {
                    Response.Write("空值");
                }
                else
                    Response.Write(temp);
            }
            else
            {
                Response.Write("error");
            }

            //修改或清除 Cookies 內容
            cookie.Value = "";
            Response.SetCookie(cookie);

********************************************************************************************

跨域Cookies的刪除

若要清除跨 Domain 的 Cookie 必須清除兩次,例如說使用者在 www1.domain.com 要執行登出動作,必須要先將 Domain 為 www1.domain.com 的 Cookie 給清除掉,在接著將 Domain 為 .domain.com 的這個 Cookie 清除掉。

因為這兩個 Cookie 為「同名」,全部都叫做 account,所以無法在一個 HTTP Request 中清除掉兩個同名的 Cookie,所以必須要在不同的兩個 HTTP Request 中個別刪除不同 Domain 的 Cookie。

 示例代碼:
 
 HttpContext context = HttpContext.Current;
 
 HttpCookie c = context.Request.Cookies["account"];
 c.Expires = DateTime.Now.AddDays(-1);
 
 //先清除.domain.com的Cookie
 if (String.IsNullOrEmpty(context.Request["domain"]))
 {
     c.Domain = ".domain.com";
     context.Response.SetCookie(c);
     context.Response.Redirect("?domain=mine", true);
 }
  else
  {
      context.Response.SetCookie(c);
  }