Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。
Cookie 明文保存在客户端,每次随请求被发送到服务器端(存放在Header中)
浏览器对Cookie的大小和数量有限制,大部分浏览器支持最大为4M最多为20个的cookie,当cookie数量超过时,旧的cookie会被清除
在Asp.net中,读写Cookie是通过使用HttpCookie类来完成的,它的定义如下:
public sealed class HttpCookie
{
// 获取或设置将此 Cookie 与其关联的域。默认值为当前域。
public string Domain { get; set; }
// 获取或设置此 Cookie 的过期日期和时间(在客户端)。
public DateTime Expires { get; set; }
// 获取一个值,通过该值指示 Cookie 是否具有子键。
public bool HasKeys { get; }
// 获取或设置一个值,该值指定 Cookie 是否可通过客户端脚本访问。
// 如果 Cookie 具有 HttpOnly 属性且不能通过客户端脚本访问,则为 true;否则为 false。默认为 false。
public bool HttpOnly { get; set; }
// 获取或设置 Cookie 的名称。
public string Name { get; set; }
// 获取或设置要与当前 Cookie 一起传输的虚拟路径。默认值为当前请求的路径。
public string Path { get; set; }
// 获取或设置一个值,该值指示是否使用安全套接字层 (SSL)(即仅通过 HTTPS)传输 Cookie。
public bool Secure { get; set; }
// 获取或设置单个 Cookie 值。默认值为空引用。
public string Value { get; set; }
// 获取单个 Cookie 对象所包含的键值对的集合。
public NameValueCollection Values { get; }
// 获取 System.Web.HttpCookie.Values 属性的快捷方式。
public string this[string key] { get; set; }
}
写入Cookie,在服务端写的Cookie,最后其实是通过HTTP的响应头这种途径发送到客户端的。每一个写入动作,都会产生一个【Set-Cookie】的响应头。
HttpCookie cookie = new HttpCookie("MyCookieName", "string value");
Response.Cookies.Add(cookie);
读取cookie,Cookie是放在请求头中,发送到服务端的。如果你一直刷新页面,就能发现, 每次HTTP请求,Cookie都会被发送
HttpCookie cookie = Request.Cookies["MyCookieName"];
if( cookie != null )
labCookie1.Text = cookie.Value;
else
labCookie1.Text = "未定义";
删除Cookie,设置此Cookie已经过期,浏览器接收到这个Cookie时,便会删除它们。
HttpCookie cookie = new HttpCookie("MyCookieName", null);
cookie.Expires = new DateTime(1900, 1, 1);
Response.Cookies.Add(cookie);
对于复杂对象的cookie,一种方式将每个属性依次放入cookie中,第二种方式将复杂对象转换成josn对象再存入cookie中
使用js读写cookie
<script type="text/javascript">
function WriteCookie() {
var cookie = "cookie_js=22222222; path=/";
document.cookie = cookie;
}
</script>
<script type="text/javascript">
function ReadCookie() {
alert(document.cookie);
}
</script>
除非使用无Cookie的会话模式,否则Session是需要Cookie的支持,服务端需要将会话标识ID保存到Cookie中。
Cookie扩展
/// <summary>
/// 用于方便使用Cookie的扩展工具类
/// </summary>
public static class CookieExtension
{
// 我们可以为一些使用频率高的类型写专门的【读取】方法
/// <summary>
/// 从一个Cookie中读取字符串值。
/// </summary>
/// <param name="cookie"></param>
/// <returns></returns>
public static string GetString(this HttpCookie cookie)
{
if( cookie == null )
return null;
return cookie.Value;
}
/// <summary>
/// 从一个Cookie中读取 Int 值。
/// </summary>
/// <param name="cookie"></param>
/// <param name="defaultVal"></param>
/// <returns></returns>
public static int ToInt(this HttpCookie cookie, int defaultVal)
{
if( cookie == null )
return defaultVal;
return cookie.Value.TryToInt(defaultVal);
}
/// <summary>
/// 从一个Cookie中读取值并转成指定的类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cookie"></param>
/// <returns></returns>
public static T ConverTo<T>(this HttpCookie cookie)
{
if( cookie == null )
return default(T);
return (T)Convert.ChangeType(cookie.Value, typeof(T));
}
/// <summary>
/// 从一个Cookie中读取【JSON字符串】值并反序列化成一个对象,用于读取复杂对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cookie"></param>
/// <returns></returns>
public static T FromJson<T>(this HttpCookie cookie)
{
if( cookie == null )
return default(T);
return cookie.Value.FromJson<T>();
}
/// <summary>
/// 将一个对象写入到Cookie
/// </summary>
/// <param name="obj"></param>
/// <param name="name"></param>
/// <param name="expries"></param>
public static void WriteCookie(this object obj, string name, DateTime? expries)
{
if( obj == null )
throw new ArgumentNullException("obj");
if( string.IsNullOrEmpty(name) )
throw new ArgumentNullException("name");
HttpCookie cookie = new HttpCookie(name, obj.ToString());
if( expries.HasValue )
cookie.Expires = expries.Value;
HttpContext.Current.Response.Cookies.Add(cookie);
}
/// <summary>
/// 删除指定的Cookie
/// </summary>
/// <param name="name"></param>
public static void DeleteCookie(string name)
{
if( string.IsNullOrEmpty(name) )
throw new ArgumentNullException("name");
HttpCookie cookie = new HttpCookie(name);
// 删除Cookie,其实就是设置一个【过期的日期】
cookie.Expires = new DateTime(1900, 1, 1);
HttpContext.Current.Response.Cookies.Add(cookie);
}
}
在使用System.Web.Security.FormsAuthentication.SetAuthCookie("fish", false)来标示验证时,服务器端将FormsAuthenticationTicket加密后使用Cookie存放
以上信息来自http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html