浏览器抓取网页(2021-12-06Cookies为Web应用程序提供了存储特定用户信息的方法)

优采云 发布时间: 2022-03-16 09:25

  浏览器抓取网页(2021-12-06Cookies为Web应用程序提供了存储特定用户信息的方法)

  2021-12-06

  Cookie 为 Web 应用程序提供了一种存储特定用户信息的方式。例如,当用户访问 网站 时,您可以使用 cookie 来存储用户的偏好或其他信息。下次用户访问 网站 时,应用程序可以检索到这个较早存储的信息。

  什么是 Cookie?

  Cookie 是在 Web 服务器和浏览器之间来回流动的小段文本,带有一个页面和一个请求。Web 应用程序可以在用户访问 网站 的任何时候读取 cookie 中收录的信息。

  例如,如果用户在网站中请求一个页面,应用程序不仅返回一个页面,还返回一个收录日期和时间的cookie,当用户的浏览器获取到该页面时,浏览器会获取到这个cookie并存储在用户硬盘上的特定目录中。

  然后,如果用户想再次从 网站 请求页面,当用户将 URL 输入浏览器时,浏览器将在本地硬盘驱动器上查找与该 URL 关联的 cookie。如果 cookie 存在,浏览器会将其与页面请求一起发送到 网站。然后,应用程序可以检测用户上次访问 网站 的日期和时间。您还可以使用此信息向用户显示消息或检查日期是否已过期。

  Cookies是与网站关联的,而不是与特定页面关联的,所以无论用户请求网站中的哪个页面,浏览器和服务器之间都会交换cookie信息。就像用户访问的不同的网站一样,每个网站都可以向用户的浏览器发送一个cookie;浏览器将分别存储来自不同 网站 的所有 cookie。

  Cookie 可以帮助网站存储有关访问者的信息。通常,cookie 是一种在 Web 应用程序中保持连续性的方式,即关于状态管理。除了它们实际上交换信息之外,浏览器和 Web 服务器之间的连接通常会中断。访问 Web 服务器的用户发出的每个请求都被认为是独立的。大多数情况下,它可以帮助 Web 服务器在用户请求页面时识别用户。例如,shopping网站 网络服务器始终跟踪每个购物者,从而能够管理购物车和其他用户特定信息。cookie因此起到名片的作用,呈现相关的认证信息以协助应用程序的运行。

  Cookie 可用于多种目的,所有这些都涉及帮助网站用户的记忆。例如,投票管理器网站可能会将cookie简单地视为一个布尔值来指示用户的浏览器是否参与了投票,从而禁止用户重复投票;网站会使用cookies记录用户是否登录,让用户无需重复输入验证信息。

  Cookie 的限制

  大多数浏览器支持最长 4096 字节的 cookie。由于此限制,cookie 最适合用于存储小数据,最好是标识符(例如用户 ID)。然后,用户 ID 可用于识别当前用户并从数据库或其他数据存储中读取用户信息。(有关存储用户信息的安全影响的信息,请参阅本文档的 [Cookie 和安全] 部分。)

  浏览器还限制 网站 可以存储在用户浏览器中的 cookie 数量。大多数浏览器只允许每个 网站 最多 20 个 cookie;如果您尝试存储更多,最旧的 cookie 将被丢弃。一些浏览器还施加了一个绝对限制,即它们可以接受的 cookie 总数不能超过 300(来自 网站 的所有 cookie 的总和)。

  您可能遇到的另一个 cookie 限制是用户可以将其浏览器设置为拒绝 cookie。如果你定义了一个 P3P 保密策略并将其存储在 网站 的根目录中,大多数浏览器都会接受来自 网站 的 cookie。但是,您可能完全避免使用 cookie 并使用不同的机制来存储特定的用户信息。存储用户信息的一种常见方式是使用会话状态,而会话状态又依赖于 Cookie,如本文[Cookie 和会话状态] 部分所述。

  提示:有关在 Web 应用程序中存储用户信息的状态管理和状态选项的更多信息,请参阅:[ASP.NET 状态管理概述] 和 [ASP.NET 状态管理建议]。

  尽管 Cookie 在应用程序中很有用,但应用程序不应依赖 Cookie 的使用。请不要使用 cookie 来支持关键功能。如果您的应用程序必须依赖 cookie,您可以测试您的浏览器以查看它是否接受使用 cookie。请参阅本文的“检查您的浏览器是否接受 Cookie”部分。

  写饼干

  浏览器负责管理用户系统上的 cookie。通过 HttpResponse 对象发送到浏览器的 Cookie 公开了一个名为 Cookies 的集合。您可以访问 HttpResponse 对象,就像访问 Page 类的 Response 属性一样。您需要发送到浏览器的任何 cookie 都必须添加到此集合中。创建 cookie 后,您需要为其指定 Name 和 Value 属性。每个 cookie 必须具有唯一的名称,以便在浏览器中读取时被识别。由于 cookie 是按名称存储的,因此两个具有相同名称的 cookie 之一将被覆盖。

  您还可以设置 cookie 的到期日期和时间。当用户访问 网站 并重写 cookie 时,浏览器会删除过期的 cookie。可以根据应用程序确定的 cookie 的有效期来设置 cookie 的过期时间。要使 cookie 长期存在,您可以将过期日期设置为从现在起 50 年。

  提示:用户可以随时从他们的计算机中清除 cookie。即使您存储了一个长期有效的cookie,用户仍然可以决定删除所有cookie,这样cookie中存储的所有设置都将被销毁。

  如果您不为 cookie 设置过期日期,仍然可以创建 cookie,但不会将其存储在用户的硬盘上。相反,此类 cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时,Cookie 也会被丢弃。当信息只需要短暂存储或出于安全原因不应写入客户端计算机的硬盘驱动器时,此类非持久性 cookie 非常有用。例如,非持久性 cookie 适合用户在公共计算机上使用,或者当您不希望将 cookie 写入硬盘时。

  您可以通过多种方式将 cookie 写入 Cookies 集合。以下示例说明了编写 cookie 的两种方法:

  Response.Cookies["userName"].Value = "patrick";

Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("lastVisit");

aCookie.Value = DateTime.Now.ToString();

aCookie.Expires = DateTime.Now.AddDays(1);

Response.Cookies.Add(aCookie);

  该实例向 Cookies 集合添加了两个 Cookie,一个名为 userName,另一个名为 lastVisit。至于第一个cookie,直接设置Cookies集合的值。您可以使用此方法向集合中添加值,因为 Cookies 是 NameObject采集Base 类型的专用集合。

  至于第二个cookie,代码创建一个HttpCookie类型的对象实例,设置它的属性,然后通过Add方法将它添加到Cookies集合中。实例化 HttpCookie 对象时,必须将 cookie 的名称作为构造函数的一部分传递。

  这两个实例都完成了将 cookie 写入浏览器的相同任务。在这两种方法中,有效期属性值必须是 DateTime 类型。但是,lastVisited 中的值也是表示日期和时间的值。由于所有 cookie 值都应该以字符串格式存储,因此 datetime 值会自动转换为字符串。

  具有多个值的 Cookie

  您可以在 cookie 中存储单个值,例如用户名或上次访问时间。您还可以将多个名称/值对存储在单独的 cookie 中。名称/值数据对被引用为子键。(展开的子键的格式类似于 URL 中的查询字符串。)例如,您可以创建一个名为 userInfo 的单独 cookie 来收录子键 userName 和 lastVisit,而不是创建两个名为 userName 和 lastVisit 的单独 Cookie。上次访问。

  您可能出于多种原因使用子项。首先,方便将相关信息或类似信息放入单独的cookie中。此外,由于所有信息都在一个单独的 cookie 中,因此 cookie 的参数(例如到期日期)适用于所有信息。(相反,如果您需要为不同类型的信息指定不同的到期日期,那么您应该将该信息存储在单独的 cookie 中。)

  带有子键的 Cookie 还可以帮助您突破 Cookie 文件大小限制。如前面[Cookie 限制] 部分所述,cookie 的大小限制通常为 4096 字节,单个 网站 不能存储超过 20 个 cookie。通过使用带有子键的单独 cookie,您可以减少使用的 cookie 数量。此外,单个 cookie 中最多只能出现 50 个字符(到期日期信息等),加上其中存储的值的长度,加起来将近 4096 个字节。如果您使用 5 个子键而不是 5 个单独的 cookie,那么您可以在每个 cookie 中存储接近 200 字节的数据。

  要创建带有子键的 cookie,您将使用不同的语法来编写单个 cookie。以下示例说明了编写相同 cookie 的两种方法(每个都有两个子键):

  Response.Cookies["userInfo"]["userName"] = "patrick";

Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();

Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("userInfo");

aCookie.Values["userName"] = "patrick";

aCookie.Values["lastVisit"] = DateTime.Now.ToString();

aCookie.Expires = DateTime.Now.AddDays(1);

Response.Cookies.Add(aCookie);

  控制 cookie 的范围

  默认情况下,网站 的所有 cookie 一起存储在客户端,并且所有 cookie 与来自 网站 的任何请求一起发送到服务器。换句话说,网站 中的每个页面都可以获取 网站 的所有 cookie。但是,您可以通过两种方式设置 cookie 的范围:

  将 Cookie 限制在目录或应用程序中

  要将 cookie 限制在服务器的目录中,请设置 cookie 的 Path 属性,如下例所示:

  HttpCookie appCookie = new HttpCookie("AppCookie");

appCookie.Value = "written " + DateTime.Now.ToString();

appCookie.Expires = DateTime.Now.AddDays(1);

appCookie.Path = "/Application1";

Response.Cookies.Add(appCookie);

  提示:您也可以通过直接添加到 Cookies 集合来编写 cookie,如前面的示例所示。

  路径可以在 网站 的物理根目录和虚拟根目录中。结果将是 cookie 仅可用于目录或虚拟根 Application1 中的页面。例如,如果您的名字是 网站,则在上一个示例中创建的 cookie 将仅可用于路径中的页面及其下方的所有子目录。但是,此 cookie 不适用于其他应用程序中的页面,例如 .

  提示:某些浏览器中的路径区分大小写。您无法控制用户如何在浏览器中输入 URL,但如果您的应用程序依赖 cookie 来限制特定路径,请确保您创建的任何超链接的 URL 与 Path 属性值中的大小写匹配。

  限制 cookie 的域范围

  默认情况下,cookie 与特定域相关联。例如,如果您的 网站 是,那么每当用户从 网站 请求任何页面时,您编写的 cookie 都会发送到服务器。(可能不包括具有特定路径值的 Cookie。)如果您的 网站 也有子域(例如 、 和 ),那么您可以将特定的子域与 cookie 相关联。为此,请设置 cookie 的 Domain 属性,如示例所示:

  Response.Cookies["domain"].Value = DateTime.Now.ToString();

Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);

Response.Cookies["domain"].Domain = "support.contoso.com";

  当以这种方式设置域时,cookie 将仅可用于该特定域内的页面。您还可以使用 Domain 属性创建可跨多个子域共享的 cookie,如以下示例所示:

  Response.Cookies["domain"].Value = DateTime.Now.ToString();

Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);

Response.Cookies["domain"].Domain = "contoso.com";

  cookie 现在将可用于主域以及域。

  读取 cookie

  当浏览器向服务器发送请求时,它会将 cookie 与请求一起发送到服务器。在您的 ASP.NET 应用程序中,您可以使用 HttpRequest 对象读取 Cookie,该对象显示为 Page 类的 Request 属性。HttpRequest 对象的结构与 HttpResponse 对象的结构本质上是相同的,因此您可以从 HttpRequest 对象中读取 Cookies,其方式类似于将 Cookies 写入 HttpResponse 对象。以下代码示例说明了获取 cookie(名为 userName)的值并将其显示在 Label 控件中的两种方法:

  if(Request.Cookies["userName"] != null)

Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);

if(Request.Cookies["userName"] != null)

{

HttpCookie aCookie = Request.Cookies["userName"];

Label1.Text = Server.HtmlEncode(aCookie.Value);

}

  在尝试获取 cookie 的值之前,您应该确保 cookie 已经存在;如果 cookie 不存在,您将收到 NullReferenceException。请注意,在显示 cookie 的内容之前,已调用 HtmlEncode 方法进行编码。这使得恶意用户无法将可执行脚本添加到 cookie。有关 cookie 安全的更多信息,请参阅:[Cookie 和安全]。

  提示:由于不同浏览器存储cookies的方式不同,同一台电脑上的浏览器无法读取其他类型浏览器设置的cookies。例如,如果您使用 Internet Explorer 测试页面,然后使用不同的浏览器再次测试,则第二个浏览器将无法找到 Internet Explorer 存储的 cookie。

  从 cookie 中读取子键的值与设置时类似。以下代码示例说明了获取子键值的一种方法:

  if(Request.Cookies["userInfo"] != null)

{

Label1.Text =

Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);

Label2.Text =

Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);

}

  在前面的示例中,代码读取子项 lastVisit 中的值,该值设置为在前面的示例中呈现为字符串的 DateTime 值。Cookies 将值存储为字符串,因此如果需要将 lastVisit 值用作日期对象,则应将其强制转换为适当的类型,如下例所示:

  DateTime dt;

dt = DateTime.Parse(Request.Cookies["userInfo"]["lastVisit"]);

  cookie 中的子键被键入为 NameValue采集 类型的集合。因此,获取单个子键的另一种方法是先获取子键的集合,然后按名称提取子键的值,如下例所示:

  if(Request.Cookies["userInfo"] != null)

{

System.Collections.Specialized.NameValueCollection

UserInfoCookieCollection;

UserInfoCookieCollection = Request.Cookies["userInfo"].Values;

Label1.Text =

Server.HtmlEncode(UserInfoCookieCollection["userName"]);

Label2.Text =

Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]);

}

  更改 cookie 过期时间

  浏览器负责管理cookies,cookies的过期时间和日期有助于浏览器管理其存储的cookies。因此,虽然您可以读取 cookie 的名称和值,但您无法读取 cookie 的到期日期和时间。当浏览器向服务器发送cookie信息时,浏览器不收录有效期信息。(cookie 的 Expires 属性始终返回零日期值。)如果您关心 cookie 的到期时间,您应该重置它,如本文“更改和删除 cookie”部分所述。

  提示:在 cookie 发送到浏览器之前,您可以读取 cookie 的 Expires 属性(在 HttpResponse 对象中设置)。但是,您无法从 HttpRequest 对象向后获取过期时间。

  阅读 cookie 集合

  有时您可能需要阅读所有 cookie 并使它们可用于页面。要将所有 cookie 的名称和值读入页面,可以如下循环遍历 Cookies 集合。

<p>System.Text.StringBuilder output = new System.Text.StringBuilder();

HttpCookie aCookie;

for(int i=0; i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线