找回密码
 立即注册
首页 业界区 业界 细说Cookie

细说Cookie

馏栩梓 2025-5-29 19:13:45
Cookie虽然是个很简单的东西,但它又是WEB开发中一个很重要的客户端数据来源,而且它可以实现扩展性很好的会话状态,所以我认为每个WEB开发人员都有必要对它有个清晰的认识。本文将对Cookie这个话题做一个全面的描述,也算是我对Cookie的认识总结。
Cookie 概述

Cookie是什么? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。
为什么需要Cookie? 因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分是不是来源于同一个浏览器。所以,需要额外的数据用于维护会话。Cookie 正是这样的一段随HTTP请求一起被传递的额外数据。
Cookie能做什么? Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及它会随着每次请求被发送到服务器,所以应该保证它不要太大。Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以,不适合保存重要的或者涉及隐私的内容。
Cookie 的限制。 大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。
通过前面的内容,我们了解到Cookie是用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取。下面本文将按这个过程看看Cookie是如何从服务端写入,最后如何传到服务端以及如何读取的。
Cookie的写、读过程

在Asp.net中,读写Cookie是通过使用HttpCookie类来完成的,它的定义如下:
  1. public sealed class HttpCookie
  2. {
  3.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>// 获取或设置将此 Cookie 与其关联的域。默认值为当前域。
  6.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  7. </authentication><forms name="UserStatus"></forms>
  8. </authentication>public string Domain { get; set; }
  9.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>// 获取或设置此 Cookie 的过期日期和时间(在客户端)。
  12.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  13. </authentication><forms name="UserStatus"></forms>
  14. </authentication>public DateTime Expires { get; set; }
  15.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>// 获取一个值,通过该值指示 Cookie 是否具有子键。
  18.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  19. </authentication><forms name="UserStatus"></forms>
  20. </authentication>public bool HasKeys { get; }
  21.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>// 获取或设置一个值,该值指定 Cookie 是否可通过客户端脚本访问。
  24.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  25. </authentication><forms name="UserStatus"></forms>
  26. </authentication>// 如果 Cookie 具有 HttpOnly 属性且不能通过客户端脚本访问,则为 true;否则为 false。默认为 false。
  27.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  28. </authentication><forms name="UserStatus"></forms>
  29. </authentication>public bool HttpOnly { get; set; }
  30.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  31. </authentication><forms name="UserStatus"></forms>
  32. </authentication>// 获取或设置 Cookie 的名称。
  33.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  34. </authentication><forms name="UserStatus"></forms>
  35. </authentication>public string Name { get; set; }
  36.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  37. </authentication><forms name="UserStatus"></forms>
  38. </authentication>// 获取或设置要与当前 Cookie 一起传输的虚拟路径。默认值为当前请求的路径。
  39.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  40. </authentication><forms name="UserStatus"></forms>
  41. </authentication>public string Path { get; set; }
  42.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  43. </authentication><forms name="UserStatus"></forms>
  44. </authentication>// 获取或设置一个值,该值指示是否使用安全套接字层 (SSL)(即仅通过 HTTPS)传输 Cookie。
  45.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  46. </authentication><forms name="UserStatus"></forms>
  47. </authentication>public bool Secure { get; set; }
  48.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  49. </authentication><forms name="UserStatus"></forms>
  50. </authentication>// 获取或设置单个 Cookie 值。默认值为空引用。
  51.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  52. </authentication><forms name="UserStatus"></forms>
  53. </authentication>public string Value { get; set; }
  54.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  55. </authentication><forms name="UserStatus"></forms>
  56. </authentication>// 获取单个 Cookie 对象所包含的键值对的集合。
  57.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  58. </authentication><forms name="UserStatus"></forms>
  59. </authentication>public NameValueCollection Values { get; }
  60.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  61. </authentication><forms name="UserStatus"></forms>
  62. </authentication>// 获取 System.Web.HttpCookie.Values 属性的快捷方式。
  63.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  64. </authentication><forms name="UserStatus"></forms>
  65. </authentication>public string this[string key] { get; set; }
  66. }
复制代码
Cookie写入浏览器的过程:我们可以使用如下代码在Asp.net项目中写一个Cookie 并发送到客户端的浏览器(为了简单我没有设置其它属性)。
  1. HttpCookie cookie = new HttpCookie("MyCookieName", "string value");
  2. Response.Cookies.Add(cookie);
复制代码
我想很多人都写过类似的代码,但是,大家有没有想过:Cookie最后是如何发送到客户端的呢?我们打开Fiddler来看一下吧。
1.gif

从上图,您应该能发现,我们在服务端写的Cookie,最后其实是通过HTTP的响应头这种途径发送到客户端的。每一个写入动作,都会产生一个【Set-Cookie】的响应头。
浏览器正是在每次获取请求的响应后,检查这些头来接收Cookie的。
Asp.net获取Cookie的过程:我们可以使用如下代码在Asp.net项目中读取一个Cookie
  1. HttpCookie cookie = Request.Cookies["MyCookieName"];
  2. if( cookie != null )
  3.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>labCookie1.Text = cookie.Value;
  6. else
  7.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  8. </authentication><forms name="UserStatus"></forms>
  9. </authentication>labCookie1.Text = "未定义";
复制代码
代码同样也很简单,还是类似的问题:大家有没有想过,Cookie是如何传到服务端的呢?我们还是继续使用Fiddler来寻找答案吧。
2.gif

从图片中,我们可以发现,Cookie是放在请求头中,发送到服务端的。如果你一直刷新页面,就能发现,每次HTTP请求,Cookie都会被发送。当然了,浏览器也不是发送它所接收到的所有Cookie,它会检查当前要请求的域名以及目录,只要这二项目与Cookie对应的Domain和Path匹配,才会发送。对于Domain则是按照尾部匹配的原则进行的。
所以,我在访问 www.cnblogs.com 时,浏览器并不会将我在浏览 www.163.com 所接收到的 Cookie 发出去。
删除Cookie:其实就是在写Cookie时,设置Expires为一个【早于现在时间的时间】。也就是:设置此Cookie已经过期,浏览器接收到这个Cookie时,便会删除它们。
  1. HttpCookie cookie = new HttpCookie("MyCookieName", null);
  2. cookie.Expires = new DateTime(1900, 1, 1);
  3. Response.Cookies.Add(cookie);
复制代码
使用Cookie保存复杂对象

前面的示例代码大致演示了Cookie的读写操作。不过,我们平时可能希望将更复杂的【自定义类型】通过Cookie来保存,那么又该如何操作呢?对于这个问题,我们定义一个类型来看看如何处理。
  1. public class DisplaySettings
  2. {
  3.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>public int Style;
  6.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  7. </authentication><forms name="UserStatus"></forms>
  8. </authentication>public int Size;
  9.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>
  12.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  13. </authentication><forms name="UserStatus"></forms>
  14. </authentication>public override string ToString()
  15.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>{
  18.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  19. </authentication><forms name="UserStatus"></forms>
  20. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  21. </authentication><forms name="UserStatus"></forms>
  22. </authentication>return string.Format("Style = {0}, Size = {1}", this.Style, this.Size);
  23.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  24. </authentication><forms name="UserStatus"></forms>
  25. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  26. </authentication><forms name="UserStatus"></forms>
  27. </authentication>
  28. }
复制代码
上面的代码,我定义一个类型,用于保存用户在浏览页面时的显示设置。接下来,我将介绍二种方法在Cookie中保存并读取它们。
方法-1,经典做法。(注意前面给出的HttpCookie定义代码中的最后二个成员)
  1. private void WriteCookie_2a()
  2. {
  3.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>DisplaySettings setting = new DisplaySettings { Style = 1, Size = 24 };
  6.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  7. </authentication><forms name="UserStatus"></forms>
  8. </authentication>HttpCookie cookie = new HttpCookie("DisplaySettings1");
  9.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>cookie["Style"] = setting.Style.ToString();
  12.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  13. </authentication><forms name="UserStatus"></forms>
  14. </authentication>cookie["Size"] = setting.Size.ToString();
  15.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>Response.Cookies.Add(cookie);
  18. }
  19. private void ReadCookie_2a()
  20. {
  21.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>HttpCookie cookie = Request.Cookies["DisplaySettings1"];
  24.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  25. </authentication><forms name="UserStatus"></forms>
  26. </authentication>if( cookie == null )
  27.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  28. </authentication><forms name="UserStatus"></forms>
  29. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication>labDisplaySettings1.Text = "未定义";
  32.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  33. </authentication><forms name="UserStatus"></forms>
  34. </authentication>else {
  35.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  36. </authentication><forms name="UserStatus"></forms>
  37. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  38. </authentication><forms name="UserStatus"></forms>
  39. </authentication>DisplaySettings setting = new DisplaySettings();
  40.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  41. </authentication><forms name="UserStatus"></forms>
  42. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  43. </authentication><forms name="UserStatus"></forms>
  44. </authentication>setting.Style = cookie["Style"].TryToInt();
  45.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  46. </authentication><forms name="UserStatus"></forms>
  47. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  48. </authentication><forms name="UserStatus"></forms>
  49. </authentication>setting.Size = cookie["Size"].TryToInt();
  50.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  51. </authentication><forms name="UserStatus"></forms>
  52. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  53. </authentication><forms name="UserStatus"></forms>
  54. </authentication>labDisplaySettings1.Text = setting.ToString();
  55.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  56. </authentication><forms name="UserStatus"></forms>
  57. </authentication>}
  58. }
复制代码
方法-2,将对象JSON序列化为字符串。
  1. private void WriteCookie_2b()
  2. {
  3.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>DisplaySettings setting = new DisplaySettings { Style = 2, Size = 48 };
  6.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  7. </authentication><forms name="UserStatus"></forms>
  8. </authentication>HttpCookie cookie = new HttpCookie("DisplaySettings2", setting.ToJson());
  9.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>Response.Cookies.Add(cookie);
  12. }
  13. private void ReadCookie_2b()
  14. {
  15.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>HttpCookie cookie = Request.Cookies["DisplaySettings2"];
  18.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  19. </authentication><forms name="UserStatus"></forms>
  20. </authentication>if( cookie == null )
  21.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  24. </authentication><forms name="UserStatus"></forms>
  25. </authentication>labDisplaySettings2.Text = "未定义";
  26.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  27. </authentication><forms name="UserStatus"></forms>
  28. </authentication>else {
  29.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  32. </authentication><forms name="UserStatus"></forms>
  33. </authentication>DisplaySettings setting = cookie.Value.FromJson<DisplaySettings>();
  34.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  35. </authentication><forms name="UserStatus"></forms>
  36. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  37. </authentication><forms name="UserStatus"></forms>
  38. </authentication>labDisplaySettings2.Text = setting.ToString();
  39.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  40. </authentication><forms name="UserStatus"></forms>
  41. </authentication>}
  42. }
复制代码
这段代码使用了我定义的二个扩展方法。
  1. /// <summary>
  2. /// 将一个对象序列化成 JSON 格式字符串
  3. /// </summary>
  4. /// <param name="obj"></param>
  5. /// <returns></returns>
  6. public static string ToJson(this object obj)
  7. {
  8.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  9. </authentication><forms name="UserStatus"></forms>
  10. </authentication>if( obj == null )
  11.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  12. </authentication><forms name="UserStatus"></forms>
  13. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  14. </authentication><forms name="UserStatus"></forms>
  15. </authentication>return string.Empty;
  16.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  17. </authentication><forms name="UserStatus"></forms>
  18. </authentication>JavaScriptSerializer jss = new JavaScriptSerializer();
  19.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  20. </authentication><forms name="UserStatus"></forms>
  21. </authentication>return jss.Serialize(obj);
  22. }
  23. /// <summary>
  24. /// 从JSON字符串中反序列化对象
  25. /// </summary>
  26. /// <typeparam name="T"></typeparam>
  27. /// <param name="cookie"></param>
  28. /// <returns></returns>
  29. public static T FromJson<T>(this string cookie)
  30. {
  31.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  32. </authentication><forms name="UserStatus"></forms>
  33. </authentication>if( string.IsNullOrEmpty(cookie) )
  34.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  35. </authentication><forms name="UserStatus"></forms>
  36. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  37. </authentication><forms name="UserStatus"></forms>
  38. </authentication>return default(T);
  39.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  40. </authentication><forms name="UserStatus"></forms>
  41. </authentication>JavaScriptSerializer jss = new JavaScriptSerializer();
  42.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  43. </authentication><forms name="UserStatus"></forms>
  44. </authentication>return jss.Deserialize<T>(cookie);
  45. }
复制代码
对于这二种方法,我个人更喜欢后者,因为它具有更好扩展性:如果类型增加了成员,不需要修改读写Cookie的代码。
不过,这种方式产生的有些字符,比如【双引号】,极少数浏览器(Opera)不支持,所以需要做UrlEncode或者Base64编码处理。
同理,对于第一种方法,遇到Value有【双引号】时,我们同样需要做UrlEncode或者Base64编码处理。
Js中读写Cookie

Cookie并非只能在服务端读写,在客户端的浏览器中也可以实现对它的读写访问。而且在JS中创建的Cookie对于服务端仍然有效(可见),接下来我们来看看在JS中如何写入Cookie,演示代码将创建一个按钮,并在点击按钮后写入Cookie
  1. [/code]在JS中写Cookie很简单,只要给document.cookie赋值一个Cookie字符串即可,至于格式,可以参考前面用Fiddle看到的结果。
  2. 再来看一下如何使用JS读取Cookie吧。请参考如下代码:
  3. [code]
复制代码
3.gif

仍然是访问document.cookie,不过,这次我们得到却是全部的Cookie值,每个Key/Value项用分号分开,中间则用等号分开。 所以,如果您想在JS中读取Cookie,一定要按照这个规则来拆分并解析您要读取的Cookie项。鉴于这样的操作有些繁琐,我们可以jquery.cookie.js插件来轻松完成这个功能,有兴趣的朋友也可以看一下它是如何处理的。这个插件的代码比较少,这里就直接贴出,
  1. /**
  2. * Create a cookie with the given name and value and other optional parameters.
  3. *
  4. * @example $.cookie('the_cookie', 'the_value');
  5. * @desc Set the value of a cookie.
  6. * @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true});
  7. * @desc Create a cookie with all available options.
  8. * @example $.cookie('the_cookie', 'the_value');
  9. * @desc Create a session cookie.
  10. * @example $.cookie('the_cookie', null);
  11. * @desc Delete a cookie by passing null as value.
  12. *
  13. * @param String name The name of the cookie.
  14. * @param String value The value of the cookie.
  15. * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
  16. * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
  17. *    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  18. </authentication><forms name="UserStatus"></forms>
  19. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  20. </authentication><forms name="UserStatus"></forms>
  21. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  24. </authentication><forms name="UserStatus"></forms>
  25. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  26. </authentication><forms name="UserStatus"></forms>
  27. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  28. </authentication><forms name="UserStatus"></forms>
  29. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication> If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
  32. *    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  33. </authentication><forms name="UserStatus"></forms>
  34. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  35. </authentication><forms name="UserStatus"></forms>
  36. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  37. </authentication><forms name="UserStatus"></forms>
  38. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  39. </authentication><forms name="UserStatus"></forms>
  40. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  41. </authentication><forms name="UserStatus"></forms>
  42. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  43. </authentication><forms name="UserStatus"></forms>
  44. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  45. </authentication><forms name="UserStatus"></forms>
  46. </authentication> If set to null or omitted, the cookie will be a session cookie and will not be retained
  47. *    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  48. </authentication><forms name="UserStatus"></forms>
  49. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  50. </authentication><forms name="UserStatus"></forms>
  51. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  52. </authentication><forms name="UserStatus"></forms>
  53. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  54. </authentication><forms name="UserStatus"></forms>
  55. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  56. </authentication><forms name="UserStatus"></forms>
  57. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  58. </authentication><forms name="UserStatus"></forms>
  59. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  60. </authentication><forms name="UserStatus"></forms>
  61. </authentication> when the the browser exits.
  62. * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
  63. * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
  64. * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
  65. *    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  66. </authentication><forms name="UserStatus"></forms>
  67. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  68. </authentication><forms name="UserStatus"></forms>
  69. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  70. </authentication><forms name="UserStatus"></forms>
  71. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  72. </authentication><forms name="UserStatus"></forms>
  73. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  74. </authentication><forms name="UserStatus"></forms>
  75. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  76. </authentication><forms name="UserStatus"></forms>
  77. </authentication>require a secure protocol (like HTTPS).
  78. * @type undefined
  79. *
  80. * @name $.cookie
  81. * @cat Plugins/Cookie
  82. * @author Klaus Hartl/klaus.hartl@stilbuero.de
  83. */
  84. /**
  85. * Get the value of a cookie with the given name.
  86. *
  87. * @example $.cookie('the_cookie');
  88. * @desc Get the value of a cookie.
  89. *
  90. * @param String name The name of the cookie.
  91. * @return The value of the cookie.
  92. * @type String
  93. *
  94. * @name $.cookie
  95. * @cat Plugins/Cookie
  96. * @author Klaus Hartl/klaus.hartl@stilbuero.de
  97. */
  98. jQuery.cookie = function(name, value, options) {
  99.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  100. </authentication><forms name="UserStatus"></forms>
  101. </authentication>if (typeof value != 'undefined') { // name and value given, set cookie
  102.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  103. </authentication><forms name="UserStatus"></forms>
  104. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  105. </authentication><forms name="UserStatus"></forms>
  106. </authentication>options = options || {};
  107.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  108. </authentication><forms name="UserStatus"></forms>
  109. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  110. </authentication><forms name="UserStatus"></forms>
  111. </authentication>if (value === null) {
  112.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  113. </authentication><forms name="UserStatus"></forms>
  114. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  115. </authentication><forms name="UserStatus"></forms>
  116. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  117. </authentication><forms name="UserStatus"></forms>
  118. </authentication>value = '';
  119.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  120. </authentication><forms name="UserStatus"></forms>
  121. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  122. </authentication><forms name="UserStatus"></forms>
  123. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  124. </authentication><forms name="UserStatus"></forms>
  125. </authentication>options.expires = -1;
  126.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  127. </authentication><forms name="UserStatus"></forms>
  128. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  129. </authentication><forms name="UserStatus"></forms>
  130. </authentication>}
  131.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  132. </authentication><forms name="UserStatus"></forms>
  133. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  134. </authentication><forms name="UserStatus"></forms>
  135. </authentication>var expires = '';
  136.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  137. </authentication><forms name="UserStatus"></forms>
  138. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  139. </authentication><forms name="UserStatus"></forms>
  140. </authentication>if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
  141.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  142. </authentication><forms name="UserStatus"></forms>
  143. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  144. </authentication><forms name="UserStatus"></forms>
  145. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  146. </authentication><forms name="UserStatus"></forms>
  147. </authentication>var date;
  148.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  149. </authentication><forms name="UserStatus"></forms>
  150. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  151. </authentication><forms name="UserStatus"></forms>
  152. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  153. </authentication><forms name="UserStatus"></forms>
  154. </authentication>if (typeof options.expires == 'number') {
  155.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  156. </authentication><forms name="UserStatus"></forms>
  157. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  158. </authentication><forms name="UserStatus"></forms>
  159. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  160. </authentication><forms name="UserStatus"></forms>
  161. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  162. </authentication><forms name="UserStatus"></forms>
  163. </authentication>date = new Date();
  164.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  165. </authentication><forms name="UserStatus"></forms>
  166. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  167. </authentication><forms name="UserStatus"></forms>
  168. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  169. </authentication><forms name="UserStatus"></forms>
  170. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  171. </authentication><forms name="UserStatus"></forms>
  172. </authentication>date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
  173.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  174. </authentication><forms name="UserStatus"></forms>
  175. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  176. </authentication><forms name="UserStatus"></forms>
  177. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  178. </authentication><forms name="UserStatus"></forms>
  179. </authentication>} else {
  180.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  181. </authentication><forms name="UserStatus"></forms>
  182. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  183. </authentication><forms name="UserStatus"></forms>
  184. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  185. </authentication><forms name="UserStatus"></forms>
  186. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  187. </authentication><forms name="UserStatus"></forms>
  188. </authentication>date = options.expires;
  189.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  190. </authentication><forms name="UserStatus"></forms>
  191. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  192. </authentication><forms name="UserStatus"></forms>
  193. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  194. </authentication><forms name="UserStatus"></forms>
  195. </authentication>}
  196.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  197. </authentication><forms name="UserStatus"></forms>
  198. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  199. </authentication><forms name="UserStatus"></forms>
  200. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  201. </authentication><forms name="UserStatus"></forms>
  202. </authentication>expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
  203.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  204. </authentication><forms name="UserStatus"></forms>
  205. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  206. </authentication><forms name="UserStatus"></forms>
  207. </authentication>}
  208.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  209. </authentication><forms name="UserStatus"></forms>
  210. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  211. </authentication><forms name="UserStatus"></forms>
  212. </authentication>var path = options.path ? '; path=' + options.path : '';
  213.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  214. </authentication><forms name="UserStatus"></forms>
  215. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  216. </authentication><forms name="UserStatus"></forms>
  217. </authentication>var domain = options.domain ? '; domain=' + options.domain : '';
  218.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  219. </authentication><forms name="UserStatus"></forms>
  220. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  221. </authentication><forms name="UserStatus"></forms>
  222. </authentication>var secure = options.secure ? '; secure' : '';
  223.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  224. </authentication><forms name="UserStatus"></forms>
  225. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  226. </authentication><forms name="UserStatus"></forms>
  227. </authentication>document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
  228.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  229. </authentication><forms name="UserStatus"></forms>
  230. </authentication>} else { // only name given, get cookie
  231.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  232. </authentication><forms name="UserStatus"></forms>
  233. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  234. </authentication><forms name="UserStatus"></forms>
  235. </authentication>var cookieValue = null;
  236.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  237. </authentication><forms name="UserStatus"></forms>
  238. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  239. </authentication><forms name="UserStatus"></forms>
  240. </authentication>if (document.cookie && document.cookie != '') {
  241.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  242. </authentication><forms name="UserStatus"></forms>
  243. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  244. </authentication><forms name="UserStatus"></forms>
  245. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  246. </authentication><forms name="UserStatus"></forms>
  247. </authentication>var cookies = document.cookie.split(';');
  248.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  249. </authentication><forms name="UserStatus"></forms>
  250. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  251. </authentication><forms name="UserStatus"></forms>
  252. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  253. </authentication><forms name="UserStatus"></forms>
  254. </authentication>for (var i = 0; i < cookies.length; i++) {
  255.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  256. </authentication><forms name="UserStatus"></forms>
  257. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  258. </authentication><forms name="UserStatus"></forms>
  259. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  260. </authentication><forms name="UserStatus"></forms>
  261. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  262. </authentication><forms name="UserStatus"></forms>
  263. </authentication>var cookie = jQuery.trim(cookies[i]);
  264.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  265. </authentication><forms name="UserStatus"></forms>
  266. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  267. </authentication><forms name="UserStatus"></forms>
  268. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  269. </authentication><forms name="UserStatus"></forms>
  270. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  271. </authentication><forms name="UserStatus"></forms>
  272. </authentication>// Does this cookie string begin with the name we want?
  273.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  274. </authentication><forms name="UserStatus"></forms>
  275. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  276. </authentication><forms name="UserStatus"></forms>
  277. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  278. </authentication><forms name="UserStatus"></forms>
  279. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  280. </authentication><forms name="UserStatus"></forms>
  281. </authentication>if (cookie.substring(0, name.length + 1) == (name + '=')) {
  282.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  283. </authentication><forms name="UserStatus"></forms>
  284. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  285. </authentication><forms name="UserStatus"></forms>
  286. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  287. </authentication><forms name="UserStatus"></forms>
  288. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  289. </authentication><forms name="UserStatus"></forms>
  290. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  291. </authentication><forms name="UserStatus"></forms>
  292. </authentication>cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
  293.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  294. </authentication><forms name="UserStatus"></forms>
  295. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  296. </authentication><forms name="UserStatus"></forms>
  297. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  298. </authentication><forms name="UserStatus"></forms>
  299. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  300. </authentication><forms name="UserStatus"></forms>
  301. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  302. </authentication><forms name="UserStatus"></forms>
  303. </authentication>break;
  304.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  305. </authentication><forms name="UserStatus"></forms>
  306. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  307. </authentication><forms name="UserStatus"></forms>
  308. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  309. </authentication><forms name="UserStatus"></forms>
  310. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  311. </authentication><forms name="UserStatus"></forms>
  312. </authentication>}
  313.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  314. </authentication><forms name="UserStatus"></forms>
  315. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  316. </authentication><forms name="UserStatus"></forms>
  317. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  318. </authentication><forms name="UserStatus"></forms>
  319. </authentication>}
  320.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  321. </authentication><forms name="UserStatus"></forms>
  322. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  323. </authentication><forms name="UserStatus"></forms>
  324. </authentication>}
  325.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  326. </authentication><forms name="UserStatus"></forms>
  327. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  328. </authentication><forms name="UserStatus"></forms>
  329. </authentication>return cookieValue;
  330.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  331. </authentication><forms name="UserStatus"></forms>
  332. </authentication>}
  333. };
复制代码
注意哦:前面我们看到了HttpCookie有个HttpOnly属性,如果它为true,那么JS是读不到那个Cookie的,也就是说:我们如果在服务端生成的Cookie不希望在JS中能被访问,可以在写Cookie时,设置这个属性。不过,通过一些工具,还是可以看到它们。
接下来,我们再来看看Asp.net中Cookie有哪些应用。
Cookie在Session中的应用

在Asp.net中,HttpContext, Page对象都有个Session的对象,我们可以使用它来方便地在服务端保存一些与会话相关的信息。
前面我们也提到过,HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分 是不是来源于同一个浏览器。所以,为了实现会话,服务端需要一个会话标识ID能保存到浏览器,让它在后续的请求时都带上这个会话标识ID,以便让服务端知道某个请求属于哪个会话,这样便可以维护与会话相关的状态数据。由于Cookie对于用户来说,是个不可见的东西,而且每次请求都会传递到服务端,所以它就是很理想的会话标识ID的保存容器。在Asp.net中,默认也就是使用Cookie来保存这个ID的。注意:虽然Asp.net 2.0也支持无Cookie的会话,但那种方式要修改URL,也有它的缺点,因此这种方法并没有广泛的使用。本文将不对这个话题做过多的分析,就此略过无Cookie会话这种方式。
我们来看看Session是如何使用Cookie来保存会话标识ID的,在默认的Asp.net配置中,Web.config有着如下定义:
  1. [/code]如果我们执行以下操作:
  2. [code]Session["Key1"] = DateTime.Now;
复制代码
此时,我们可以使用一些浏览器提供的工具来查看一下现在的Cookie情况。
4.gif

从图片上看,这个Cookie的名字就是我们在配置文件中指出的名称,我们可以修改一下配置文件:
  1. [/code]再来执行上面的写Session的操作,然后看Cookie
  2. [align=center] 5.gif [/align]
  3. 我们可以看到:SK的Cookie出现了。说明:在截图时我把名称为"ASP.NET_SessionId"的Cookie删除了。
  4. 通过上面示例,我们可以得到结论,Session的实现是与Cookie有关的,服务端需要将会话标识ID保存到Cookie中。
  5. 这里再一次申明,除非你使用无Cookie的会话模式,否则Session是需要Cookie的支持。反过来,Cookie并不需要Session的支持。
  6. [size=6]Cookie在身份验证中的应用[/size]
  7. 我想很多人都在Asp.net的开发中使用过Form身份认证。对于一个用户请求,我们可以在服务端很方便地判断它是不是代表一个已登录用户。
  8. [code]this.labStatus.Text = (Request.IsAuthenticated ? "已登录" : "未登录");
复制代码
那么,您有没有好奇过:Asp.net是如何识别一个请求是不是一个已登录用户发起的呢?说到这里,我们就要从用户登录说起了。为了实现登录及Form认证方式,我们需要如下配置:
  1.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>
复制代码
接下来,我们需要实现用户登录逻辑。具体实现方式有很多,不过,最终的调用都是差不多的,如下代码所示:
  1. private void SetLogin(){    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>System.Web.Security.FormsAuthentication.SetAuthCookie("fish", false);}
复制代码
只要执行了以上代码,我们就可以看到,前面的判断【Request.IsAuthenticated】返回true,最终会显示"已登录"。为了探寻这个秘密,我们还是来看一下当前页面的Cookie情况。
6.gif

果然,多出来一个Cookie,名称与我在配置文件中指定的名称相同。我们再来看看如果注销当前登录会是什么样子的:
  1. private void SetLogout(){    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>System.Web.Security.FormsAuthentication.SignOut();}
复制代码
7.gif

看到了吗,名为"UserStatus"的Cookie不见了。此时如果你再去观察【Request.IsAuthenticated】,可以发现它此时返回 false。或者,您也可以再试一次,登录后,直接删除名为"UserStatus"的Cookie,也能发现登录状态将显示"未登录"。或许,您还是有点不清楚前面我调用【System.Web.Security.FormsAuthentication.SetAuthCookie("fish", false);】后,Asp.net做了些什么,回答这个问题其实很简单:自己用Reflector.exe去看一下Asp.net的实现吧。
这里为了更让您能信服登录与Cookie有关,我将直接创建一个Cookie看一下Asp.net能不能认可我创建的Cookie,并认为登录有效。请看代码:
  1. private void SetLogin(){    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>//System.Web.Security.FormsAuthentication.SetAuthCookie("fish", false);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>// 下面的代码和上面的代码在作用上是等效的。    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  6. </authentication><forms name="UserStatus"></forms>
  7. </authentication>FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  8. </authentication><forms name="UserStatus"></forms>
  9. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>2, "fish", DateTime.Now, DateTime.Now.AddDays(30d), false, string.Empty);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  12. </authentication><forms name="UserStatus"></forms>
  13. </authentication>string str = FormsAuthentication.Encrypt(ticket);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  14. </authentication><forms name="UserStatus"></forms>
  15. </authentication>HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, str);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>Response.Cookies.Add(cookie);}
复制代码
如果执行这段代码,您将发现:【Request.IsAuthenticated】返回true,登录状态会显示"已登录"。
至此,我们可以得出一个结论:Form身份认证依赖Cookie,Asp.net就是每次检查我们在配置文件中指定的Cookie名称,并解密这个Cookie来判断当前请求用户的登录状态。
Cookie的安全状况

从以上图片,您应该能发现:浏览器能提供一些界面让用户清楚的观察我们在服务端写的Cookie,甚至有些浏览器还提供很方便的修改功能。如下图所示:
8.gif

所以,我们在服务端写代码读取Cookie时,尤其是涉及类型转换、反序列化或者解密时,一定要注意这些操作都有可能会失败。而且上图也清楚的反映了一个事实:Cookie中的值都是“一目了然”的,任何人都能看到它们。所以,我们尽量不要直接在Cookie中保存一些重要的或者敏感的内容。如果我们确实需要使用Cookie保存一些重要的内容,但又不希望被他人看懂,我们可以使用一些加密的方法来保护这些内容。
1. 对于一些重要性不高的内容,我们可以使用Base64之类的简单处理方式来处理。
2. 对于重要性相对高一点的内容,我们可以利用.net提供的一些加密工具类,自己来设计加密方法来保护。不过,密码学与加密解密并不是很简单的算法,因此,自己设计的加密方式可能不会很安全。
3. 重要的内容,我们可以使用.net提供的FormsAuthenticationTicket,FormsAuthentication来加密。我认为这种方式还是比较安全的。毕竟前面我们也看过了,Asp.net的Form身份认证就是使用这种方式来加密用户登录的身份标识的,所以,如果这种方式不安全,也就意味着Asp.net的身份认证也不安全了。如果您使用这种方式来加密,那么请注意:它产生的加密后文本还是比较大的,前面我也提到过,每次请求时,浏览器都会带上与请求相匹配的所有Cookie,因此,这种Cookie会对传输性能产生一定的影响,所以,请小心使用,切记不可过多的使用。
这里要补充一下:去年曾经出现过【Padding Oracle Attack】这个话题,一些人甚至错误的认为是Asp.net加密方式不安全!如果您也是这样认为的,那么可以看一下这篇文章:浅谈这次ASP.NET的Padding Oracle Attack相关内容,以消除这个错误的认识。当然了,我们也可以从这个话题得到一些收获:解密失败时,不要给出过多的提示,就当没有这个Cookie存在。
如何在C#发请的请求中使用Cookie

前面我们一直在谈服务端与浏览器中使用Cookie,其实浏览器也是一个普通的应用程序,.net framework也提供一些类也能让我们直接发起HTTP请求,下面我们来看一下如何在C#发请的请求中使用Cookie ,其实也很简单,主要是使用了CookieContainer类,请看以下演示代码:
  1. private static string SendHttpRequestGet(string url, Encoding encoding,    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  6. </authentication><forms name="UserStatus"></forms>
  7. </authentication> CookieContainer cookieContainer)    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  8. </authentication><forms name="UserStatus"></forms>
  9. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  12. </authentication><forms name="UserStatus"></forms>
  13. </authentication>if( string.IsNullOrEmpty(url) )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  14. </authentication><forms name="UserStatus"></forms>
  15. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  18. </authentication><forms name="UserStatus"></forms>
  19. </authentication>throw new ArgumentNullException("url");    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  20. </authentication><forms name="UserStatus"></forms>
  21. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>if( encoding == null )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  24. </authentication><forms name="UserStatus"></forms>
  25. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  26. </authentication><forms name="UserStatus"></forms>
  27. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  28. </authentication><forms name="UserStatus"></forms>
  29. </authentication>throw new ArgumentNullException("encoding");    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  32. </authentication><forms name="UserStatus"></forms>
  33. </authentication>HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  34. </authentication><forms name="UserStatus"></forms>
  35. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  36. </authentication><forms name="UserStatus"></forms>
  37. </authentication>request.Method = "GET";    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  38. </authentication><forms name="UserStatus"></forms>
  39. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  40. </authentication><forms name="UserStatus"></forms>
  41. </authentication>request.CookieContainer = cookieContainer;    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  42. </authentication><forms name="UserStatus"></forms>
  43. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  44. </authentication><forms name="UserStatus"></forms>
  45. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  46. </authentication><forms name="UserStatus"></forms>
  47. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  48. </authentication><forms name="UserStatus"></forms>
  49. </authentication>using( WebResponse response = request.GetResponse() ) {    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  50. </authentication><forms name="UserStatus"></forms>
  51. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  52. </authentication><forms name="UserStatus"></forms>
  53. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  54. </authentication><forms name="UserStatus"></forms>
  55. </authentication>using( StreamReader reader = new StreamReader(response.GetResponseStream(), encoding) ) {    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  56. </authentication><forms name="UserStatus"></forms>
  57. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  58. </authentication><forms name="UserStatus"></forms>
  59. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  60. </authentication><forms name="UserStatus"></forms>
  61. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  62. </authentication><forms name="UserStatus"></forms>
  63. </authentication>return reader.ReadToEnd();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  64. </authentication><forms name="UserStatus"></forms>
  65. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  66. </authentication><forms name="UserStatus"></forms>
  67. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  68. </authentication><forms name="UserStatus"></forms>
  69. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  70. </authentication><forms name="UserStatus"></forms>
  71. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  72. </authentication><forms name="UserStatus"></forms>
  73. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  74. </authentication><forms name="UserStatus"></forms>
  75. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  76. </authentication><forms name="UserStatus"></forms>
  77. </authentication>private void SendHttpDEMO()    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  78. </authentication><forms name="UserStatus"></forms>
  79. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  80. </authentication><forms name="UserStatus"></forms>
  81. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  82. </authentication><forms name="UserStatus"></forms>
  83. </authentication>StringBuilder sb = new StringBuilder();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  84. </authentication><forms name="UserStatus"></forms>
  85. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  86. </authentication><forms name="UserStatus"></forms>
  87. </authentication>CookieContainer cookieContainer = new CookieContainer();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  88. </authentication><forms name="UserStatus"></forms>
  89. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  90. </authentication><forms name="UserStatus"></forms>
  91. </authentication>string url = "http://www.taobao.com";    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  92. </authentication><forms name="UserStatus"></forms>
  93. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  94. </authentication><forms name="UserStatus"></forms>
  95. </authentication>SendHttpRequestGet(url, Encoding.Default, cookieContainer);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  96. </authentication><forms name="UserStatus"></forms>
  97. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  98. </authentication><forms name="UserStatus"></forms>
  99. </authentication>// 后面可以继续发起HTTP请求,此时将会包含上次从服务器写入的Cookie    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  100. </authentication><forms name="UserStatus"></forms>
  101. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  102. </authentication><forms name="UserStatus"></forms>
  103. </authentication>//SendHttpRequestGet("同域名下的其它URL", Encoding.Default, cookieContainer);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  104. </authentication><forms name="UserStatus"></forms>
  105. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  106. </authentication><forms name="UserStatus"></forms>
  107. </authentication>// 至此,我们可以显示取得了哪些Cookie    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  108. </authentication><forms name="UserStatus"></forms>
  109. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  110. </authentication><forms name="UserStatus"></forms>
  111. </authentication>CookieCollection cookies = cookieContainer.GetCookies(new Uri(url));    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  112. </authentication><forms name="UserStatus"></forms>
  113. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  114. </authentication><forms name="UserStatus"></forms>
  115. </authentication>if( cookies != null ) {    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  116. </authentication><forms name="UserStatus"></forms>
  117. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  118. </authentication><forms name="UserStatus"></forms>
  119. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  120. </authentication><forms name="UserStatus"></forms>
  121. </authentication>foreach( System.Net.Cookie cookie in cookies )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  122. </authentication><forms name="UserStatus"></forms>
  123. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  124. </authentication><forms name="UserStatus"></forms>
  125. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  126. </authentication><forms name="UserStatus"></forms>
  127. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  128. </authentication><forms name="UserStatus"></forms>
  129. </authentication>sb.AppendLine(cookie.ToString());    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  130. </authentication><forms name="UserStatus"></forms>
  131. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  132. </authentication><forms name="UserStatus"></forms>
  133. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  134. </authentication><forms name="UserStatus"></forms>
  135. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  136. </authentication><forms name="UserStatus"></forms>
  137. </authentication>txtCookies.Text = sb.ToString();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  138. </authentication><forms name="UserStatus"></forms>
  139. </authentication>}
复制代码
重构与使用总结

在前面的Asp.net示例代码中,我一直使用.net提供的HttpCookie类来操作Cookie,是为了展示用原始的方式来使用Cookie,这些代码有点重复,也有点繁琐,为此,我提供了几个简单的方法可以更容易的使用Cookie,也算是对Cookie使用的一个总结。
  1. /// /// 用于方便使用Cookie的扩展工具类/// public static class CookieExtension{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>// 我们可以为一些使用频率高的类型写专门的【读取】方法    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  6. </authentication><forms name="UserStatus"></forms>
  7. </authentication> /// 从一个Cookie中读取字符串值。    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  8. </authentication><forms name="UserStatus"></forms>
  9. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  12. </authentication><forms name="UserStatus"></forms>
  13. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  14. </authentication><forms name="UserStatus"></forms>
  15. </authentication> public static string GetString(this HttpCookie cookie)    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  18. </authentication><forms name="UserStatus"></forms>
  19. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  20. </authentication><forms name="UserStatus"></forms>
  21. </authentication>if( cookie == null )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  24. </authentication><forms name="UserStatus"></forms>
  25. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  26. </authentication><forms name="UserStatus"></forms>
  27. </authentication>return null;    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  28. </authentication><forms name="UserStatus"></forms>
  29. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication>return cookie.Value;    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  32. </authentication><forms name="UserStatus"></forms>
  33. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  34. </authentication><forms name="UserStatus"></forms>
  35. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  36. </authentication><forms name="UserStatus"></forms>
  37. </authentication> /// 从一个Cookie中读取 Int 值。    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  38. </authentication><forms name="UserStatus"></forms>
  39. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  40. </authentication><forms name="UserStatus"></forms>
  41. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  42. </authentication><forms name="UserStatus"></forms>
  43. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  44. </authentication><forms name="UserStatus"></forms>
  45. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  46. </authentication><forms name="UserStatus"></forms>
  47. </authentication> public static int ToInt(this HttpCookie cookie, int defaultVal)    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  48. </authentication><forms name="UserStatus"></forms>
  49. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  50. </authentication><forms name="UserStatus"></forms>
  51. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  52. </authentication><forms name="UserStatus"></forms>
  53. </authentication>if( cookie == null )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  54. </authentication><forms name="UserStatus"></forms>
  55. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  56. </authentication><forms name="UserStatus"></forms>
  57. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  58. </authentication><forms name="UserStatus"></forms>
  59. </authentication>return defaultVal;    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  60. </authentication><forms name="UserStatus"></forms>
  61. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  62. </authentication><forms name="UserStatus"></forms>
  63. </authentication>return cookie.Value.TryToInt(defaultVal);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  64. </authentication><forms name="UserStatus"></forms>
  65. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  66. </authentication><forms name="UserStatus"></forms>
  67. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  68. </authentication><forms name="UserStatus"></forms>
  69. </authentication> /// 从一个Cookie中读取值并转成指定的类型    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  70. </authentication><forms name="UserStatus"></forms>
  71. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  72. </authentication><forms name="UserStatus"></forms>
  73. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  74. </authentication><forms name="UserStatus"></forms>
  75. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  76. </authentication><forms name="UserStatus"></forms>
  77. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  78. </authentication><forms name="UserStatus"></forms>
  79. </authentication> public static T ConverTo(this HttpCookie cookie)    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  80. </authentication><forms name="UserStatus"></forms>
  81. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  82. </authentication><forms name="UserStatus"></forms>
  83. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  84. </authentication><forms name="UserStatus"></forms>
  85. </authentication>if( cookie == null )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  86. </authentication><forms name="UserStatus"></forms>
  87. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  88. </authentication><forms name="UserStatus"></forms>
  89. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  90. </authentication><forms name="UserStatus"></forms>
  91. </authentication>return default(T);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  92. </authentication><forms name="UserStatus"></forms>
  93. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  94. </authentication><forms name="UserStatus"></forms>
  95. </authentication>return (T)Convert.ChangeType(cookie.Value, typeof(T));    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  96. </authentication><forms name="UserStatus"></forms>
  97. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  98. </authentication><forms name="UserStatus"></forms>
  99. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  100. </authentication><forms name="UserStatus"></forms>
  101. </authentication> /// 从一个Cookie中读取【JSON字符串】值并反序列化成一个对象,用于读取复杂对象    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  102. </authentication><forms name="UserStatus"></forms>
  103. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  104. </authentication><forms name="UserStatus"></forms>
  105. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  106. </authentication><forms name="UserStatus"></forms>
  107. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  108. </authentication><forms name="UserStatus"></forms>
  109. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  110. </authentication><forms name="UserStatus"></forms>
  111. </authentication> public static T FromJson(this HttpCookie cookie)    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  112. </authentication><forms name="UserStatus"></forms>
  113. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  114. </authentication><forms name="UserStatus"></forms>
  115. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  116. </authentication><forms name="UserStatus"></forms>
  117. </authentication>if( cookie == null )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  118. </authentication><forms name="UserStatus"></forms>
  119. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  120. </authentication><forms name="UserStatus"></forms>
  121. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  122. </authentication><forms name="UserStatus"></forms>
  123. </authentication>return default(T);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  124. </authentication><forms name="UserStatus"></forms>
  125. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  126. </authentication><forms name="UserStatus"></forms>
  127. </authentication>return cookie.Value.FromJson();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  128. </authentication><forms name="UserStatus"></forms>
  129. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  130. </authentication><forms name="UserStatus"></forms>
  131. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  132. </authentication><forms name="UserStatus"></forms>
  133. </authentication> /// 将一个对象写入到Cookie    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  134. </authentication><forms name="UserStatus"></forms>
  135. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  136. </authentication><forms name="UserStatus"></forms>
  137. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  138. </authentication><forms name="UserStatus"></forms>
  139. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  140. </authentication><forms name="UserStatus"></forms>
  141. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  142. </authentication><forms name="UserStatus"></forms>
  143. </authentication> public static void WriteCookie(this object obj, string name, DateTime? expries)    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  144. </authentication><forms name="UserStatus"></forms>
  145. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  146. </authentication><forms name="UserStatus"></forms>
  147. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  148. </authentication><forms name="UserStatus"></forms>
  149. </authentication>if( obj == null )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  150. </authentication><forms name="UserStatus"></forms>
  151. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  152. </authentication><forms name="UserStatus"></forms>
  153. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  154. </authentication><forms name="UserStatus"></forms>
  155. </authentication>throw new ArgumentNullException("obj");    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  156. </authentication><forms name="UserStatus"></forms>
  157. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  158. </authentication><forms name="UserStatus"></forms>
  159. </authentication>if( string.IsNullOrEmpty(name) )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  160. </authentication><forms name="UserStatus"></forms>
  161. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  162. </authentication><forms name="UserStatus"></forms>
  163. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  164. </authentication><forms name="UserStatus"></forms>
  165. </authentication>throw new ArgumentNullException("name");    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  166. </authentication><forms name="UserStatus"></forms>
  167. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  168. </authentication><forms name="UserStatus"></forms>
  169. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  170. </authentication><forms name="UserStatus"></forms>
  171. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  172. </authentication><forms name="UserStatus"></forms>
  173. </authentication>HttpCookie cookie = new HttpCookie(name, obj.ToString());    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  174. </authentication><forms name="UserStatus"></forms>
  175. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  176. </authentication><forms name="UserStatus"></forms>
  177. </authentication>if( expries.HasValue )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  178. </authentication><forms name="UserStatus"></forms>
  179. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  180. </authentication><forms name="UserStatus"></forms>
  181. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  182. </authentication><forms name="UserStatus"></forms>
  183. </authentication>cookie.Expires = expries.Value;    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  184. </authentication><forms name="UserStatus"></forms>
  185. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  186. </authentication><forms name="UserStatus"></forms>
  187. </authentication>HttpContext.Current.Response.Cookies.Add(cookie);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  188. </authentication><forms name="UserStatus"></forms>
  189. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  190. </authentication><forms name="UserStatus"></forms>
  191. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  192. </authentication><forms name="UserStatus"></forms>
  193. </authentication> /// 删除指定的Cookie    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  194. </authentication><forms name="UserStatus"></forms>
  195. </authentication>///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  196. </authentication><forms name="UserStatus"></forms>
  197. </authentication> ///    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  198. </authentication><forms name="UserStatus"></forms>
  199. </authentication> public static void DeleteCookie(string name)    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  200. </authentication><forms name="UserStatus"></forms>
  201. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  202. </authentication><forms name="UserStatus"></forms>
  203. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  204. </authentication><forms name="UserStatus"></forms>
  205. </authentication>if( string.IsNullOrEmpty(name) )    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  206. </authentication><forms name="UserStatus"></forms>
  207. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  208. </authentication><forms name="UserStatus"></forms>
  209. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  210. </authentication><forms name="UserStatus"></forms>
  211. </authentication>throw new ArgumentNullException("name");    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  212. </authentication><forms name="UserStatus"></forms>
  213. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  214. </authentication><forms name="UserStatus"></forms>
  215. </authentication>HttpCookie cookie = new HttpCookie(name);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  216. </authentication><forms name="UserStatus"></forms>
  217. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  218. </authentication><forms name="UserStatus"></forms>
  219. </authentication>// 删除Cookie,其实就是设置一个【过期的日期】    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  220. </authentication><forms name="UserStatus"></forms>
  221. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  222. </authentication><forms name="UserStatus"></forms>
  223. </authentication>cookie.Expires = new DateTime(1900, 1, 1);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  224. </authentication><forms name="UserStatus"></forms>
  225. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  226. </authentication><forms name="UserStatus"></forms>
  227. </authentication>HttpContext.Current.Response.Cookies.Add(cookie);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  228. </authentication><forms name="UserStatus"></forms>
  229. </authentication>}}
复制代码
更完整的代码可以从本文的示例代码中获得。(文章底部有下载地址)
使用方式:
  1. public static class TestClass{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>public static void Write()    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  6. </authentication><forms name="UserStatus"></forms>
  7. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  8. </authentication><forms name="UserStatus"></forms>
  9. </authentication>string str = "中国";    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  12. </authentication><forms name="UserStatus"></forms>
  13. </authentication>int aa = 25;    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  14. </authentication><forms name="UserStatus"></forms>
  15. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>DisplaySettings setting = new DisplaySettings { Style = 3, Size = 50 };    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  18. </authentication><forms name="UserStatus"></forms>
  19. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  20. </authentication><forms name="UserStatus"></forms>
  21. </authentication>DateTime dt = new DateTime(2012, 1, 1, 12, 0, 0);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  24. </authentication><forms name="UserStatus"></forms>
  25. </authentication>str.WriteCookie("Key1", DateTime.Now.AddDays(1d));    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  26. </authentication><forms name="UserStatus"></forms>
  27. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  28. </authentication><forms name="UserStatus"></forms>
  29. </authentication>aa.WriteCookie("Key2", null);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  32. </authentication><forms name="UserStatus"></forms>
  33. </authentication>setting.ToJson().WriteCookie("Key3", null);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  34. </authentication><forms name="UserStatus"></forms>
  35. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  36. </authentication><forms name="UserStatus"></forms>
  37. </authentication>dt.WriteCookie("Key4", null);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  38. </authentication><forms name="UserStatus"></forms>
  39. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  40. </authentication><forms name="UserStatus"></forms>
  41. </authentication>public static void Read()    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  42. </authentication><forms name="UserStatus"></forms>
  43. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  44. </authentication><forms name="UserStatus"></forms>
  45. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  46. </authentication><forms name="UserStatus"></forms>
  47. </authentication>HttpRequest request = HttpContext.Current.Request;    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  48. </authentication><forms name="UserStatus"></forms>
  49. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  50. </authentication><forms name="UserStatus"></forms>
  51. </authentication>string str = request.Cookies["Key1"].GetString();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  52. </authentication><forms name="UserStatus"></forms>
  53. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  54. </authentication><forms name="UserStatus"></forms>
  55. </authentication>int num = request.Cookies["Key2"].ToInt(0);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  56. </authentication><forms name="UserStatus"></forms>
  57. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  58. </authentication><forms name="UserStatus"></forms>
  59. </authentication>DisplaySettings setting = request.Cookies["Key3"].FromJson();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  60. </authentication><forms name="UserStatus"></forms>
  61. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  62. </authentication><forms name="UserStatus"></forms>
  63. </authentication>DateTime dt = request.Cookies["Key4"].ConverTo();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  64. </authentication><forms name="UserStatus"></forms>
  65. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  66. </authentication><forms name="UserStatus"></forms>
  67. </authentication>}
复制代码
注意哦:以上代码中都是直接使用字符串"Key"的形式,这种方式对于大一些的程序在后期可能会影响维护。
所以建议:将访问Cookie所使用的Key能有一个类来统一的定义,或者将读写操作包装成一些属性放在一个类中统一的管理。
  1. public static class CookieValues{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>// 建议把Cookie相关的参数放在一起,提供 get / set 属性(或者方法)来访问,以避免"key"到处乱写    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  4. </authentication><forms name="UserStatus"></forms>
  5. </authentication>public static string AAA    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  6. </authentication><forms name="UserStatus"></forms>
  7. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  8. </authentication><forms name="UserStatus"></forms>
  9. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  10. </authentication><forms name="UserStatus"></forms>
  11. </authentication>get { return HttpContext.Current.Request.Cookies["Key1"].GetString(); }    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  12. </authentication><forms name="UserStatus"></forms>
  13. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  14. </authentication><forms name="UserStatus"></forms>
  15. </authentication>public static int BBB    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  16. </authentication><forms name="UserStatus"></forms>
  17. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  18. </authentication><forms name="UserStatus"></forms>
  19. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  20. </authentication><forms name="UserStatus"></forms>
  21. </authentication>get { return HttpContext.Current.Request.Cookies["Key2"].ToInt(0); }    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  22. </authentication><forms name="UserStatus"></forms>
  23. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  24. </authentication><forms name="UserStatus"></forms>
  25. </authentication>public static DisplaySettings CCC    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  26. </authentication><forms name="UserStatus"></forms>
  27. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  28. </authentication><forms name="UserStatus"></forms>
  29. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication>get { return HttpContext.Current.Request.Cookies["Key3"].FromJson(); }    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  32. </authentication><forms name="UserStatus"></forms>
  33. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  34. </authentication><forms name="UserStatus"></forms>
  35. </authentication>public static DateTime DDD    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  36. </authentication><forms name="UserStatus"></forms>
  37. </authentication>{    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  38. </authentication><forms name="UserStatus"></forms>
  39. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  40. </authentication><forms name="UserStatus"></forms>
  41. </authentication>get { return HttpContext.Current.Request.Cookies["Key4"].ConverTo(); }    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  42. </authentication><forms name="UserStatus"></forms>
  43. </authentication>}}
复制代码
补充

根据一些朋友提供的反馈,这里再补充4个需要注意的地方:
1. 如果使用Form登录验证且希望使用Cookie方式时,建议设置 cookieless="UseCookies",因为这个参数的默认值是:cookieless="UseDeviceProfile",Asp.net可能会误判。dudu就吃过亏。
  1.     <forms name="MyCookieName" cookieless="UseCookies"></forms>
  2. </authentication><forms name="UserStatus"></forms>
  3. </authentication>
复制代码
2. Cookie有3个属性,一般我们可以不用设置,但它们的值可以在Web.config中指定默认值:
  1. [/code]3. 虽然在写Cookie时,我们可以设置name, value之外的其它属性,但是在读取时,是读不到这些设置的。其实在我的示例代码中有体现,我前面也忘记了说明了。
  2. 4. HttpRequest.Cookies 与 HttpResponse.Cookies 会有关系(很奇怪吧)。
  3. 以下代码演示了这个现象:
  4. [code]protected void Page_Load(object sender, EventArgs e){    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  5. </authentication><forms name="UserStatus"></forms>
  6. </authentication>DateTime.Now.ToString().WriteCookie("t1", null);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  7. </authentication><forms name="UserStatus"></forms>
  8. </authentication>label1.Text = ShowAllCookies();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  9. </authentication><forms name="UserStatus"></forms>
  10. </authentication>Guid.NewGuid().ToString().WriteCookie("t2", null);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  11. </authentication><forms name="UserStatus"></forms>
  12. </authentication>// 如果去掉下面代码,将会看到2个t1    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  13. </authentication><forms name="UserStatus"></forms>
  14. </authentication> Response.Cookies.Remove("t1");    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  15. </authentication><forms name="UserStatus"></forms>
  16. </authentication>Response.Cookies.Remove("t2");}private string ShowAllCookies(){    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  17. </authentication><forms name="UserStatus"></forms>
  18. </authentication>StringBuilder sb = new StringBuilder();    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  19. </authentication><forms name="UserStatus"></forms>
  20. </authentication>for( int i = 0; i < Request.Cookies.Count; i++ ) {    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  21. </authentication><forms name="UserStatus"></forms>
  22. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  23. </authentication><forms name="UserStatus"></forms>
  24. </authentication>HttpCookie cookie = Request.Cookies[i];    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  25. </authentication><forms name="UserStatus"></forms>
  26. </authentication>    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  27. </authentication><forms name="UserStatus"></forms>
  28. </authentication>sb.AppendFormat("{0}={1}
  29. ", cookie.Name, cookie.Value);    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  30. </authentication><forms name="UserStatus"></forms>
  31. </authentication>}    <forms name="MyCookieName" cookieless="UseCookies"></forms>
  32. </authentication><forms name="UserStatus"></forms>
  33. </authentication>return sb.ToString();}
复制代码
上面的试验代码将会一直显示 t1 的Cookie ,这里就不再贴图了。

本文的所有示例代码可以点击此处下载。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下右下角的【关注 Fish Li】。
因为,我的写作热情也离不开您的肯定支持。
感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是Fish Li 。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册