跳至內容

ASP.NET/Cookie

維基教科書,自由的教學讀本

Cookie 是一小段文本信息,隨HTTP請求一起被傳遞的額外數據。只能保存明文字符串。大多數瀏覽器支持最大為 4096 字節的 Cooki,只允許每個站點存儲 20 個 Cookie,來自所有站點的 Cookie 總數作出絕對限制,通常為 300 個。

Cookie對象

[編輯]

ASP.NET中,Cookie對象是HttpCookieCollection類的一個實例。

public sealed class HttpCookie
{   
    public string Domain { get; set; }// 获取或设置将此 Cookie 与其关联的域。默认值为当前域。    
    public DateTime Expires { get; set; }// 获取或设置此 Cookie 的过期日期和时间(在客户端)。    
    public bool HasKeys { get; }// 获取一个值,通过该值指示 Cookie 是否具有子键。 
    public bool HttpOnly { get; set; }// 获取或设置一个值,该值指定 Cookie 是否可通过客户端脚本访问。如果 Cookie 具有 HttpOnly 属性且不能通过客户端脚本访问,则为 true;否则为 false。默认为 false。   
    public string Name { get; set; } // 获取或设置 Cookie 的名称。   
    public string Path { get; set; } // 获取或设置要与当前 Cookie 一起传输的虚拟路径。默认值为当前请求的路径。    
    public bool Secure { get; set; }// 获取或设置一个值,该值指示是否使用安全套接字层 (SSL)(即仅通过 HTTPS)传输 Cookie。    
    public string Value { get; set; }// 获取或设置单个 Cookie 值。默认值为空引用。    
    public NameValueCollection Values { get; }// 获取单个 Cookie 对象所包含的键值对的集合。    
    public string this[string key] { get; set; }// 获取 System.Web.HttpCookie.Values 属性的快捷方式。
}

Cookie使用

[編輯]

Cookie寫入瀏覽器的過程:

Response.Cookies["MyCookieName"]="string value";
//或者:
HttpCookie cookie = new HttpCookie("MyCookieName", "string value");
Response.Cookies.Add(cookie);

實際是通過HTTP的Set-Cookie響應頭途徑發送到客戶端。

讀取Cookie:

HttpCookie cookie = Request.Cookies["MyCookieName"];
if( cookie != null )
    labCookie1.Text = cookie.Value;
else
    labCookie1.Text = "未定义";

瀏覽器檢查當前要請求的域名以及目錄, 這二項目與Cookie的Domain和Path匹配,會被發送到服務器端。對於Domain則是按照尾部匹配的原則進行的。

刪除Cookie:

HttpCookie cookie = new HttpCookie("MyCookieName", null);
cookie.Expires = new DateTime(1900, 1, 1);
Response.Cookies.Add(cookie);

就是寫Cookie時設置Expires為一個早於現在的時間。瀏覽器接收到這個Cookie時,便會刪除它。

如果把對象作為cookie傳輸,建議將對象JSON序列化為字符串。例如:

private void WriteCookie_2b()
{
    MyDisplaySettings setting = new MyDisplaySettings { Style = 2, Size = 48 };

    HttpCookie cookie = new HttpCookie("MyDisplaySettings2", setting.ToJson());
    Response.Cookies.Add(cookie);
}

private void ReadCookie_2b()
{
    HttpCookie cookie = Request.Cookies["MyDisplaySettings2"];
    if( cookie == null )
        labDisplaySettings2.Text = "未定义";
    else {
        DisplaySettings setting = cookie.Value.FromJson<MyDisplaySettings>();
        labDisplaySettings2.Text = setting.ToString();
    }
}