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();
    }
}