Cookie编程基础:检查浏览器是否接受Cookie

  提要:一种确定浏览器是否接受 Cookie 的方法是先编写一个 Cookie,然后再尝试读取这个 Cookie。如果不能读取这个Cookie,则可以认为该浏览器不接受 Cookie。

检查浏览器是否接受 Cookie

  我在前面的 Cookie 的限制一节中曾经提到一个潜在问题,即用户可以设置自己的浏览器拒绝接受 Cookie。如何才能知道您是否可以读写 Cookie?在不能写入 Cookie 时不会出现任何错误(例如 Response.Cookies 不会抛出异常),因为服务器并不跟踪呈现页面后出现的情况。浏览器同样不会向服务器发送任何有关其当前的 Cookie 设置的信息。(也许您需要了解,但 HttpBrowserCapabilities.Cookies Property [英文] 属性并不会告诉您 Cookie 是否被启用,而只能告诉您当前的浏览器是否支持 Cookie。)

  一种确定浏览器是否接受 Cookie 的方法是先编写一个 Cookie,然后再尝试读取这个 Cookie。如果不能读取这个 Cookie,则可以认为该浏览器不接受 Cookie。

  我编写了一个简单的示例来说明如何测试 Cookie 是否被接受。该示例包含两个页面。在第一个页面中,我编写了一个 Cookie,然后把浏览器重新定向到第二个页面。第二个页面尝试读取这个 Cookie,转而将浏览器重新定向到第一个页面,并向 URL 添加一个带有测试结果的查询字符串变量。

  第一个页面的代码如下:
Sub Page_Load()
If Not Page.IsPostBack Then
If Request.QueryString("AcceptsCookies") Is Nothing Then
Response.Cookies("TestCookie").Value = "ok"
Response.Cookies("TestCookie").Expires = _
DateTime.Now.AddMinutes(1)
Response.Redirect("TestForCookies.aspx?redirect=" & _
Server.UrlEncode(Request.Url.ToString))
Else
labelAcceptsCookies.Text = "接受 Cookie = " & _
Request.QueryString("AcceptsCookies")
End If
End If
End Sub

  第一个页面测试是否有回信,如果没有,就搜索包含测试结果的查询字符串变量 (AcceptsCookies)。如果没有找到查询字符串变量,则表示测试还没有完成,代码就写出一个名为“TestCookie”的 Cookie。写出 Cookie 之后,示例调用 Response.Redirect 来切换到测试页面 (TestForCookies.aspx)。附加到测试页面的 URL 的是名为 redirect 的查询字符串变量,该变量中包含了当前页面的 URL,这样就能在执行测试后把重定向到该页面。

  测试页面可以完全由代码组成,不需要包含控件。以下就是我使用的代码:

Sub Page_Load()
Dim redirect As String = Request.QueryString("redirect")
Dim acceptsCookies As String
' 是否接受 Cookie?
If Request.Cookies("TestCookie") Is Nothing Then
' 没有 Cookie,因此不需要接受
acceptsCookies = 0
Else
acceptsCookies = 1
' 删除测试 Cookie
Response.Cookies("TestCookie").Expires = _
DateTime.Now.AddDays(-1)
End If
Response.Redirect(redirect & "?AcceptsCookies=" & acceptsCookies, _
True)
End Sub

  读取 redirect 查询字符串变量后,代码就尝试读取 Cookie。为了实现日常管理,如果该 Cookie 确实存在,就会被立即删除。测试完成后,代码从 redirect 查询字符串变量传递的 URL 构造一个新的 URL。新的 URL 也包括一个包含测试结果的查询字符串变量。最后一步是使用新的 URL 将浏览器重定向到原来的页面。

  这个示例十分简单,但说明了通过运行程序并查看结果来进行测试的基本原则。其中最需要改进的地方是要永久保存 Cookie 测试结果,这样用户就不必在每次浏览原始页面时都重复进行测试。但是,实际上并不能做到这一点。Cookie 不会起作用,原因是显而易见的。另一种可能是把测试结果保存在会话状态中,但在默认情况下,会话状态也依赖于 Cookie,而如果浏览器不接受 Cookie,会话状态也不会起作用。解决后一个问题的办法是采用无 Cookie 的会话状态。下一节我将简要介绍会话状态如何与 Cookie 协作。

  Cookie 和会话状态

  当用户访问您的站点时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束。对于每个会话,ASP.NET 都维护一种基于服务器的结构(会话状态),在该结构中应用程序可以保存用户的相关信息。有关详细信息,请参阅 Session State(英文)。

  ASP.NET 需要能跟踪每个用户的会话 ID,这样才能把用户映射到服务器上的会话状态信息。默认情况下,ASP.NET 使用一个非永久性的 Cookie 来保存会话状态。如果您使用读取 Cookie 一节的“读取 Cookie 集合”中的示例,您可能就会在 Cookie 中发现一个会话状态 Cookie。

  但是如果用户禁用了浏览器的 Cookie,会话状态就不能使用 Cookie 来保存会话 ID,会话状态也不会起作用。这就是为什么我在前面的检查浏览器是否接受 Cookie 中说,无法在 Cookie 测试完毕后把测试结果实际保存在会话状态中,因为没有 Cookie 就没有会话状态。

  ASP.NET 提供了一种解决方案,即利用无 Cookie 的会话。您可以配置自己的应用程序,不在 Cookie 中保存会话 ID,而是在站点页面的 URL 中保存。会话 ID 保存在 URL 中,也就是 ASP.NET 将 ID 保存在浏览器中,从而能够在用户请求其他页面时取回 ID。

  无 Cookie 会话可以避免浏览器拒绝 Cookie 的问题,使您能够使用会话状态。如果您的应用程序依赖于会话状态,您可能就需要对其进行配置,使它能使用无 Cookie 会话。但是,在某些情况下,如果用户与其他人共享 URL - 可能是用户通过电子邮件将 URL 发送给同事,而该用户的会话仍然处于激活状态 - 那么最终这两个用户可能共享同一个会话,结果将难以预料。

Cookie编程基础:检查浏览器是否接受Cookie相关推荐

  1. C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session

    本文主要是毕业设计"个人电脑使用记录清除软件"系列系统应用文章中关于Cookie方面的知识,主要从介绍Cookie的基础知识和PHP关于Cookie\Session两个会话管理机制 ...

  2. php微信浏览器清空cookie,微信内置浏览器中的cookie很诡异呀

    微信内置浏览器中的cookie很诡异呀 这是设置和删除COOKIE的代码 function set_cookie($var ,$value = '' ,$expire = 0){ $path = '/ ...

  3. 微信php 客户端cookie,微信内置浏览器中的cookie很诡异呀

    微信内置浏览器中的cookie很诡异呀 这是设置和删除COOKIE的代码 function set_cookie($var ,$value = '' ,$expire = 0){ $path = '/ ...

  4. android 浏览器 cookie,从Android的浏览器中传递cookie数据到App中

    从Android的浏览器中传递cookie数据到App中 蒋彪@南京 2013-4-19 1.    需求 客户有一个需求, 在Android的浏览器上登录一个site, login之后,会在本地co ...

  5. [转]学习如何使用 Cookie 编程

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

  6. ASP.NET中Cookie编程的基础知识

    一.简介 Cookie 为 Web 应用程序保存用户相关信息提供了一种有用的方法.例如,当用户访问您的站点时,您可以利用 Cookie 保存用户首选项或其他信息,这样,当用户下次再访问您的站点时,应用 ...

  7. html 怎么设置cooki,怎么设置浏览器接受cookie

    怎么设置浏览器接受cookie 把浏览器设置成接受cookie方法,以IE11为例: 1,打开IE浏览器,在菜单栏上点击"工具",弹出下拉菜单点击"Internet选项& ...

  8. Cookie编程入门篇

    Cookie就是所谓的" 小甜饼" ,他最早出现是在Netscape Navigator .0中.Cookie其实就是由Web服务器创建的.将信息存储在计算机上的文件.那么为什么W ...

  9. C#中的cookie编程

    Cookie就是所谓的" 小甜饼" ,他最早出现是在Netscape Navigator 2.0中.Cookie其实就是由Web服务器创建的.将信息存储在计算机上的文件.那么为什么 ...

最新文章

  1. aspnetcore mvc 异常处理_深入探究ASP.NET Core异常处理中间件
  2. linux madplay运行完成,Madplay移植到mini2440全过程详解
  3. ssm_maven idea分模块开发
  4. Javascript函数调用的四种模式
  5. MongoDB分析工具之三:db.currentOp()
  6. (软件工程复习核心重点)第六章实现和测试-第五节:确认测试
  7. android+geturl+方法,浅入浅出Android(014):HTTP GET获取文本内容
  8. oracle 11g ocp 笔记(14)--数据库备份和恢复配置
  9. Android应用程序键盘(Keyboard)消息处理机制分析(11)
  10. HTML DOM Image 对象
  11. redhat 完全卸载mysql_Linux完全卸载MySQL
  12. 一棵树的生物量怎么算_2019玩花园 | 夏天怎么办?
  13. java sqlldr_sqlldr详解
  14. 网络编程学习笔记之TCP_01(帅帅老师讲堂)
  15. js中最重要的是:原型对象 普通对象和函数对象 构造函数
  16. 【转】用深度学习揭示数据的因果关系
  17. Nginx+obs直播服务器,推流连接失败
  18. Okra框架(一) 简介
  19. html魔方转动效果,html5+css3实现旋转魔方的点点滴滴
  20. JAVA中的Xms、Xmx、MetaspaceSize、MaxMetaspaceSize都是什么意思?

热门文章

  1. tc275的flexcan的接收与发送
  2. 4 、python学习笔记第四课:对象、标识符、变量、赋值、常量
  3. 简图记录-批判性思维
  4. 友盟 集成到 java web_友盟消息推送SDK集成
  5. GNN:A Gentle Introduction to Graph Neural Networks
  6. Spring----Spring入门
  7. 什么是Ground-truth,Ground-truth什么意思
  8. 2010 我的求职经历(1)
  9. OKhttp3工具类
  10. java跑p_javap使用