首页 / ASP.NET / 正文

ASP.NET(C#)的Cookies操作示例

37316 发布于: 2014-08-26 读完约需16分钟

asp-net-cookie

什么是 Cookie?

Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。

Cookie 的限制

大 多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏 览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

Cookie 的各种用法

1.创建cookie

你可以用Response.Cookies来创建任何一个发往客户端浏览器的cookie,如下:
Response.Cookies["User"].Value="James";
//设置Cookie的过期时间,此处为当前时间的10天后过期
Response.Cookies["User"].Expires = DateTime.Now.AddDays(10);
当创建的Cookie名已存在时,新创建的Cookie会重写之前已经存在的,因此,如果你要编辑一个cookie,只需要重新创建一个同名的cookie即可。 当然,你也可以用HttpCookie对象来创建一个cookie,具体实现如下:
var cookie=new HttpCookie("User");
cookie.Value="James";
//设置Cookie的过期时间,此处为当前时间的10天后过期
cookie.Expires=DateTime.Now.AddDays(10);
Response.Cookies.Add(cookie);
Cookie还可以设置多个值,如下示例:
//方式1:用Response.Cookies直接设置
Response.Cookies["User"]["name"].value="James";
Response.Cookies["User"]["last"].value="Hardon";
Response.Cookies["User"].Expires=DateTime.Now.AddDays(10);
 //方式2:用HttpCookie对象创建
var cookie = new HttpCookie("User");
cookie.Values["name"]="James";
cookie.Values["last"]="Hardon";
cookie.Expires=DateTime.Now.AddDays(10);
Response.Cookies.Add(cookie);
控制 Cookie 的范围 默认情况下,一个站点的全部 Cookie 都一起存储在客户端上,而且所有 Cookie 都会随着对该站点发送的任何请求一起发送到服务器。也就是说,一个站点中的每个页面都能获得该站点的所有 Cookie。但是,可以通过两种方式设置 Cookie 的范围:
  • 将 Cookie 的范围限制到服务器上的某个文件夹,这允许您将 Cookie 限制到站点上的某个应用程序。
  • 将范围设置为某个域,这允许您指定域中的哪些子域可以访问 Cookie。

将 Cookie 限制到某个文件夹或应用程序

若要将 Cookie 限制到服务器上的某个文件夹,则需要设置 Cookie 的 Path 属性:
//方式2:用HttpCookie对象创建
var cookie = new HttpCookie("User");
cookie.Values["name"]="James";
cookie.Values["last"]="Hardon";
cookie.Expires=DateTime.Now.AddDays(10);
cookie.Path = "/Application1";
Response.Cookies.Add(cookie);

限制 Cookie 的域范围

默认 情况下,Cookie 与特定域关联。例如,如果您的站点是 www.contoso.com,那么当用户向该站点请求任何页时,您编写的 Cookie 就会被发送到服务器。(这可能不包括带有特定路径值的 Cookie。)如果站点具有子域(例如,contoso.com、sales.contoso.com 和 support.contoso.com),则可以将 Cookie 与特定的子域关联。若要执行此操作,请设置 Cookie 的 Domain 属性,如此示例所示:
Response.Cookies["User"].Value="James";
//设置Cookie的过期时间,此处为当前时间的10天后过期
Response.Cookies["User"].Expires = DateTime.Now.AddDays(10);
Response.Cookies["User"].Domain = "support.contoso.com";
当以此方式设置域时,Cookie 将仅可用于指定的子域中的页面。还可以使用 Domain 属性创建可在多个子域间共享的 Cookie,如下面的示例所示:
Response.Cookies["User"].Value="James";
//设置Cookie的过期时间,此处为当前时间的10天后过期
Response.Cookies["User"].Expires = DateTime.Now.AddDays(10);
Response.Cookies["User"].Domain = "contoso.com";
随后 Cookie 将可用于主域,也可用于 sales.contoso.com 和 support.contoso.com 域。  

2.Cookie的读取

浏览器向服务器发出请求时,会随请求一起发送该服务器的 Cookie。在 ASP.NET 应用程序中,可以使用 HttpRequest 对象读取 Cookie,该对象可用作 Page 类的 Request 属性使用。HttpRequest 对象的结构与 HttpResponse 对象的结构基本相同,因此,可以从 HttpRequest 对象中读取 Cookie,并且读取方式与将 Cookie 写入 HttpResponse 对象的方式基本相同。 特别说明:在读取Cookie之前,请判断对应的Cookie是否存在
//读取Cookie的两种方式
if(Request.Cookies["User"] != null)
   var cookie = Server.HtmlEncode(Request.Cookies["User"].Value);

if(Request.Cookies["User"] != null)
{
    var aCookie = Request.Cookies["User"];
    var cookie = Server.HtmlEncode(aCookie.Value);
}
读取 Cookie 中子键值的方法与设置该值的方法类似,如下:
if(Request.Cookies["User"] != null)
{
    var cookie1 = 
        Server.HtmlEncode(Request.Cookies["User"]["userName"]);

    var cookie1 =
        Server.HtmlEncode(Request.Cookies["User"]["lastVisit"]);
}

 读取 Cookie 集合

有时,您可能需要读取可供页面使用的所有 Cookie。若要读取可供页面使用的所有 Cookie 的名称和值,可以使用如下代码依次通过 Cookies 集合。

var output = new System.Text.StringBuilder();
HttpCookie aCookie;
for(int i=0; i<Request.Cookies.Count; i++)
{
    aCookie = Request.Cookies[i];
    output.Append("Cookie name = " + Server.HtmlEncode(aCookie.Name) 
        + "<br />");
    output.Append("Cookie value = " + Server.HtmlEncode(aCookie.Value)
        + "<br /><br />");
}
下面的示例演示对前一示例的修改。该示例使用 HasKeys 属性来测试是否存在子键,如果检测到子键,便从 Values 集合获取子键:
for(int i=0; i<Request.Cookies.Count; i++)
{
    aCookie = Request.Cookies[i];
    output.Append("Name = " + aCookie.Name + "<br />");
    if(aCookie.HasKeys)
    {
        for(int j=0; j<aCookie.Values.Count; j++)
        {
            subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys[j]);
            subkeyValue = Server.HtmlEncode(aCookie.Values[j]);
            output.Append("Subkey name = " + subkeyName + "<br />");
            output.Append("Subkey value = " + subkeyValue + 
                "<br /><br />");
        }
    }
    else
    {
        output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
            "<br /><br />");
    }
}

 修改和删除 Cookie

修改Cookie的方法前面已提到过,那创建一个同名的Cookie将原来的覆盖即可。下面介绍一下删除Cookie的方法。由于Cookie不能直接修改和删除,所以,删除的方法是将同名的Cookie设为过期即可:
Response.Cookies["User"].Value="James";
Response.Cookies["User"].Expires = DateTime.Now.AddDays(-1);

 Cookie 和安全性

Cookie 的安全性问题与从客户端获取数据的安全性问题类似。在应用程序中,Cookie 是另一种形式的用户输入,因此很容易被他们非法获取和利用。由于 Cookie 保存在用户自己的计算机上,因此,用户至少能看到您存储在 Cookie 中的数据。用户还可以在浏览器向您发送 Cookie 之前更改该 Cookie。 千万不要在 Cookie 中存储敏感信息,如用户名、密码、信用卡号等等。不要在 Cookie 中放置任何不应由用户掌握的内容,也不要放可能被其他窃取 Cookie 的人控制的内容。 同 样,不要轻信从 Cookie 中得到的信息。不要假定数据与您写出时相同;处理 Cookie 值时采用的安全措施应该与处理网页中用户键入的数据时采用的安全措施相同。本主题前面的示例演示在页面中显示值前,先对 Cookie 内容进行 HTML 编码的方法,这与在显示从用户处得到的任何信息之前的做法相同。 Cookie 以明文形式在浏览器和服务器间发送,任何可以截获 Web 通信的人都可以读取 Cookie。可以设置 Cookie 属性,使 Cookie 只能在使用安全套接字层 (SSL) 的连接上传输。SSL 并不能防止保存在用户计算机上的 Cookie 被读取或操作,但可防止 Cookie 在传输过程中被读取,因为 Cookie 已被加密。  

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: C#运行WCF服务出现HTTP could not register URL错误的解决方案(含简单解决)

下一篇: MySQL使用GROUP_CONCAT()函数按ID分组将多条记录的某个字段以逗号或者指定分隔号隔开成一条记录

本文永久链接码友网 » ASP.NET(C#)的Cookies操作示例

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册