|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
|
vbyLinux联盟 将 Cookie 限制到某个文件夹或应用程序 vbyLinux联盟 vbyLinux联盟 要将 Cookie 限制到服务器上的某个文件夹,请按如下方法设置 Cookie 的 Path 属性: vbyLinux联盟 vbyLinux联盟 Dim appCookie As New HttpCookie("AppCookie") vbyLinux联盟 appCookie.Value = "written " & Now.ToString vbyLinux联盟 appCookie.Expires = Now.AddDays(1) vbyLinux联盟 appCookie.Path = "/Application1" vbyLinux联盟 Response.Cookies.Add(appCookie) vbyLinux联盟 vbyLinux联盟 当然,您也可以通过直接设置 Response.Cookies 来编写 Cookie,如前文所述。 vbyLinux联盟 vbyLinux联盟 路径可以是站点根目录下的物理路径,也可以是虚拟根目录。这样一来,Cookie 就只能用于 Application1 文件夹或虚拟根目录中的页面。例如,如果您的站点名为 www.contoso.com,则前面示例中生成的 Cookie 就只能用于路径为 http://www.aspxuexi.com/Application1/ 的页面以及该文件夹下的所有页面,而不适用于其他应用程序中的页面,如 http://www.aspxuexi.com/Application2/ 或 http://www.aspxuexi.com/ 下的页面。 vbyLinux联盟 vbyLinux联盟 提示:通过对 Internet Explorer 和 Mozilla 浏览器进行测试发现,此处使用的路径是区分大小写的。一般而言,Windows 服务器上的 URL 不区分大小写,但这种情况例外。您无法控制用户如何在浏览器中输入 URL,但是,如果您的应用程序依赖于与特定路径相关的 Cookie,则请确保您所创建的所有超链接中的 URL 与 Path 属性值的大小写相匹配。 vbyLinux联盟 将 Cookie 的有效范围限制到域 vbyLinux联盟 默认情况下,Cookie 与特定的域相关联。例如,如果您的站点是 www.aspxuexi.com,那么当用户向该站点请求页面时,您编写的 Cookie 就被发送到服务器。(有特定路径值的 Cookie 除外,我在上一节刚刚解释过。) 如果您的站点有子域(例如 aspxuexi.com、bbs.aspxuexi.com 和 support.aspxuexi.com),就可以把 Cookie 同特定的子域相关联。为此,需要设置 Cookie 的 Domain 属性,如下所示: vbyLinux联盟 vbyLinux联盟 Response.Cookies("domain").Value = DateTime.Now.ToString vbyLinux联盟 Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) vbyLinux联盟 Response.Cookies("domain").Domain = "support.aspxuexi.com" vbyLinux联盟 vbyLinux联盟 如果按照这种方式设置域,则 Cookie 只能用于指定子域中的页面。 vbyLinux联盟 vbyLinux联盟 您也可以利用 Domain 属性来创建可在多个子域中共享的 Cookie。例如,对域进行如下设置: vbyLinux联盟 vbyLinux联盟 Response.Cookies("domain").Value = DateTime.Now.ToString vbyLinux联盟 Response.Cookies("domain").Expires = DateTime.Now.AddDays(1) vbyLinux联盟 Response.Cookies("domain").Domain = "aspxuexi.com" vbyLinux联盟 vbyLinux联盟 这样,该 Cookie 就可用于主域、aspxuexi.com 和 support.aspxuexi.com。 读取 Cookie vbyLinux联盟 当浏览器向服务器发送请求时,该服务器的 Cookie 会与请求一起发送。在 ASP.NET 应用程序中,您可以使用 Request 对象来读取 Cookie。Request 对象的结构与 Response 对象的结构基本相同,所以从 Request 对象中读取 Cookie 的方法与向 Response 对象中写入 Cookie 的方法非常类似。以下示例显示了两种方法,目的都是获取名为“username”的 Cookie 的值并将值显示在 Label 控件中: vbyLinux联盟 vbyLinux联盟 If Not Request.Cookies("userName") Is Nothing Then vbyLinux联盟 Label1.Text = Server.HtmlEncode(Request.Cookies("userName").Value) vbyLinux联盟 End If vbyLinux联盟 If Not Request.Cookies("userName") Is Nothing Then vbyLinux联盟 Dim aCookie As HttpCookie = Request.Cookies("userName") vbyLinux联盟 Label1.Text = Server.HtmlEncode(aCookie.Value) vbyLinux联盟 End If vbyLinux联盟 vbyLinux联盟 在获取 Cookie 的值之前,应该确保该 Cookie 确实存在。否则,您将得到一个 System.NullReferenceException异常。还需要注意的是,在页面中显示 Cookie 的内容之前,我调用了 HttpServerUtility.HtmlEncode方法对 Cookie 的内容进行编码。之所以这样做,是因为我要显示 Cookie 的内容(一般您不会这样做)而且要确保没有任何恶意用户在 Cookie 中添加了可执行脚本。 vbyLinux联盟 vbyLinux联盟 注意:由于不同的浏览器保存 Cookie 的方式也不同,所以同一台计算机上的不同浏览器不一定能够相互读取各自的 Cookie。例如,如果使用 Internet Explorer 测试一个页面,然后再使用其他浏览器进行测试,那么后者就不会找到 Internet Explorer 保存的 Cookie。当然,大多数人一般都是使用同一种浏览器进行 Web 交互的,因此在大多数情况下不会出现问题。但有时还是会遇到问题,比如您要测试应用程序对浏览器的兼容性。 vbyLinux联盟 读取 Cookie 中子键值的方法与设置该值的方法类似。以下是获取子键值的一种方法: vbyLinux联盟 vbyLinux联盟 If Not Request.Cookies("userInfo") Is Nothing Then vbyLinux联盟 Label1.Text = _ vbyLinux联盟 Server.HtmlEncode(Request.Cookies("userInfo")("userName")) vbyLinux联盟 Label2.text = _ vbyLinux联盟 Server.HtmlEncode(Request.Cookies("userInfo")("lastVisit")) vbyLinux联盟 End If vbyLinux联盟 vbyLinux联盟 在上面的示例中,我获取的是子键“lastVist”的值,在此前的讨论中我把该值设置为 DateTime 值的字符串表示形式。请记住,Cookie 是用字符串的形式保存值的,所以要将 lastVisit 值用作日期,就必须对其进行转换: vbyLinux联盟 vbyLinux联盟 Dim dt As DateTime vbyLinux联盟 dt = CDate(Request.Cookies("userInfo")("lastVisit")) vbyLinux联盟 Cookie 中子键的类型是 NameValueCollection类型的集合。因此,另一种获取单个子键的方法是先获取子键集合,然后按名称提取子键的值,如下所示: vbyLinux联盟 vbyLinux联盟 If Not Request.Cookies("userInfo") Is Nothing Then vbyLinux联盟 Dim UserInfoCookieCollection As _ vbyLinux联盟 System.Collections.Specialized.NameValueCollection vbyLinux联盟 UserInfoCookieCollection = Request.Cookies("userInfo").Values vbyLinux联盟 Label1.Text = Server.HtmlEncode(UserInfoCookieCollection("userName")) vbyLinux联盟 Label2.Text = Server.HtmlEncode(UserInfoCookieCollection("lastVisit")) vbyLinux联盟 End If vbyLinux联盟 vbyLinux联盟 就像设置 Cookie 一样,使用哪种方法读取 Cookie 也由您自己决定。 vbyLinux联盟 vbyLinux联盟 什么是有效期? vbyLinux联盟 您可以读取 Cookie 的名称和值,除此以外,需要了解的有关 Cookie 的信息并不是很多。虽然您可以获取 Domain 和 Path 属性,但是这些属性的用途很有限。例如,您可以读取 Domain 属性,但如果您的页面与 Cookie 不在相同的域,您根本就不会在页面的位置接收到该 Cookie。 vbyLinux联盟 vbyLinux联盟 您无法读取的是 Cookie 的过期日期和时间。事实上,当浏览器向服务器发送 Cookie 信息时,浏览器并未将过期信息包括在内。您可以读取 Expires 属性,但总是返回为零的日期/时间值。 vbyLinux联盟 vbyLinux联盟 在前面的编写 Cookie 一节中,我已经讲过,是浏览器负责管理 Cookie 的,Expires 属性就很好地印证了这一点。Expires 属性的主要作用是帮助浏览器执行有关 Cookie 保存的日常管理。从服务器的角度来看,Cookie 要么存在要么不存在,所以对服务器而言,有效期并不是有用的信息。所以,浏览器在发送 Cookie 时并不提供此信息。如果您需要 Cookie 的过期日期,就必须重新设置,关于这一点我将在修改和删除 Cookie 中介绍。 vbyLinux联盟 vbyLinux联盟 更确切地说,您可以在向浏览器发送 Cookie 之前读取已在 Response 对象中设置的 Expires 属性,但您无法从返回的 Request 对象中获取有效期信息。 vbyLinux联盟 vbyLinux联盟 读取 Cookie 集合 vbyLinux联盟 前面的示例假设您要读取名称已知的 Cookie。有时,您可能需要读取可供页面使用的所有 Cookie。要读取可供页面使用的所有 Cookie 的名称和值,您可以利用如下代码遍历 Request.Cookies 集合: vbyLinux联盟 vbyLinux联盟 Dim i As Integer vbyLinux联盟 Dim output As String = "" vbyLinux联盟 Dim aCookie As HttpCookie vbyLinux联盟 For i = 0 to Request.Cookies.Count - 1 vbyLinux联盟 aCookie = Request.Cookies(i) vbyLinux联盟 output &= "Cookie 名称 = " & Server.HtmlEncode(aCookie.Name) & "<br>" vbyLinux联盟 output &= "Cookie 值 = " & Server.HtmlEncode(aCookie.Value) & _ vbyLinux联盟 & "<br><br>" vbyLinux联盟 Next vbyLinux联盟 Label1.Text = output vbyLinux联盟 vbyLinux联盟 注意:运行此代码时,您很可能会看到一个名为“ASP.NET_SessionId”的 Cookie,ASP.NET 用这个 Cookie 来保存您的会话的唯一标识符。这个会话 Cookie 不会永久保存到您的硬盘上。有关会话 Cookie 的详细信息,请参阅本文后面的 Cookie 和会话状态。 vbyLinux联盟 前面的示例有一个限制:如果 Cookie 有子键,就会以一个单独的名称/值字符串来显示子键。Cookie 的 HasKeys属性可以告诉您该 Cookie 是否有子键。如果有子键,您可以在子键集合中向下钻取,获取各个子键的名称和值。 vbyLinux联盟 vbyLinux联盟 如前文所述,您可以从 Cookie 属性 Values中获取有关子键的信息,该属性是类型 NameValueCollection 的集合。您可以根据索引值从 Values 集合中直接读取子键值。相应的子键值可以从 Values 集合的成员 AllKeys中得到,该成员将返回一个字符串集合。 vbyLinux联盟 vbyLinux联盟 以下示例是对前一示例的修改。示例中使用 HasKeys 属性来测试子键,如果检测到子键,就从 Values 集合中获取子键: vbyLinux联盟 vbyLinux联盟 Dim i As Integer vbyLinux联盟 Dim j As Integer vbyLinux联盟 Dim output As String = "" vbyLinux联盟 Dim aCookie As HttpCookie vbyLinux联盟 Dim subkeyName As String vbyLinux联盟 Dim subkeyValue As String vbyLinux联盟 For i = 0 To Request.Cookies.Count - 1 vbyLinux联盟 aCookie = Request.Cookies(i) vbyLinux联盟 output &= "名称 = " & aCookie.Name & "<br>" vbyLinux联盟 If aCookie.HasKeys Then vbyLinux联盟 For j = 0 To aCookie.Values.Count - 1 vbyLinux联盟 subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys(j)) vbyLinux联盟 subkeyValue = Server.HtmlEncode(aCookie.Values(j)) vbyLinux联盟 output &= "子键名称 = " & subkeyName & "<br>" vbyLinux联盟 output &= "子键值 = " & subkeyValue & "<br><br>" vbyLinux联盟 Next vbyLinux联盟 Else vbyLinux联盟 output &= "值 = " & Server.HtmlEncode(aCookie.Value) & "<br><br>" vbyLinux联盟 End If vbyLinux联盟 Next vbyLinux联盟 Label1.Text = output vbyLinux联盟 vbyLinux联盟 您也可以把子键作为 NameValueCollection 对象进行提取,如下所示: vbyLinux联盟 vbyLinux联盟 If aCookie.HasKeys Then vbyLinux联盟 Dim CookieValues As _ vbyLinux联盟 System.Collections.Specialized.NameValueCollection = aCookie.Values vbyLinux联盟 Dim CookieValueNames() As String = CookieValues.AllKeys vbyLinux联盟 For j = 0 To CookieValues.Count – 1 vbyLinux联盟 subkeyName = Server.HtmlEncode(CookieValueNames(j)) vbyLinux联盟 subkeyValue = Server.HtmlEncode(CookieValues(j)) vbyLinux联盟 output &= "子键名称 = " & subkeyName & "<br>" vbyLinux联盟 output &= "子键值 = " & subkeyValue & "<br><br>" vbyLinux联盟 Next vbyLinux联盟 Else vbyLinux联盟 output &= "值 = " & aCookie.Value & "<br><br>" vbyLinux联盟 End If vbyLinux联盟 vbyLinux联盟 注意:请记住,我之所以调用 Server.HtmlEncode 方法,只是因为我要在页面上显示 Cookie 的值。如果您只是测试 Cookie 的值,就不必在使用前对其进行编码。 vbyLinux联盟 修改和删除 Cookie vbyLinux联盟 有时,您可能需要修改某个 Cookie,更改其值或延长其有效期。(请记住,由于浏览器不会把有效期信息传递到服务器,所以您无法读取 Cookie 的过期日期。) vbyLinux联盟 vbyLinux联盟 当然,实际上您并不是直接更改 Cookie。尽管您可以从 Request.Cookies 集合中获取 Cookie 并对其进行操作,但 Cookie 本身仍然存在于用户硬盘上的某个地方。因此,修改某个 Cookie 实际上是指用新的值创建新的 Cookie,并把该 Cookie 发送到浏览器,覆盖客户机上旧的 Cookie。 vbyLinux联盟 vbyLinux联盟 以下示例说明了如何更改用于储存站点访问次数的 Cookie 的值: vbyLinux联盟 vbyLinux联盟 Dim counter As Integer vbyLinux联盟 If Request.Cookies("counter") Is Nothing Then vbyLinux联盟 counter = 0 vbyLinux联盟 Else vbyLinux联盟 counter = CInt(Request.Cookies("counter").Value) vbyLinux联盟 End If vbyLinux联盟 counter += 1 vbyLinux联盟 Response.Cookies("counter").Value = counter.ToString vbyLinux联盟 Response.Cookies("counter").Expires = DateTime.Now.AddDays(1) vbyLinux联盟 vbyLinux联盟 或者: vbyLinux联盟 vbyLinux联盟 Dim ctrCookie As HttpCookie vbyLinux联盟 Dim counter As Integer vbyLinux联盟 If Request.Cookies("counter") Is Nothing Then vbyLinux联盟 ctrCookie = New HttpCookie("counter") vbyLinux联盟 Else vbyLinux联盟 ctrCookie = Request.Cookies("counter") vbyLinux联盟 End If vbyLinux联盟 counter = CInt(ctrCookie.Value) + 1 vbyLinux联盟 ctrCookie.Value = counter.ToString vbyLinux联盟 ctrCookie.Expires = DateTime.Now.AddDays(1) vbyLinux联盟 Response.Cookies.Add(ctrCookie) vbyLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|