HttpCookie

本文介绍了Cookie的基本概念及其在HTTP协议中的作用。重点讲解了Netscape Cookie草案,包括其格式、属性及浏览器处理流程。
最近在写一个简单的webserver需要实现一些必备的http协议,但是之前对这一块不是很熟悉,现在边做边学习了,今天主要学习的一个是cookie.

目前有以下几种Cookie规范:

  • Netscape cookie草案:是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,但是很多服务器都与之兼容。
  • rfc2109, 是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在使用Netscape规范。
  • rfc2965规范定义了cookie版本2,并说明了cookie版本1的不足。

rfc2965规范的使用,目前并不多。rfc2109规范相应要严格得多,在实际应用上,并不是所有的浏览器和Web服务器都严格遵守。因此相比较而言,Netscape cookie草案倒是一个比较简洁和被广泛支持的Cookie规范,因此我们在这里以Netscape cookie草案为基础进行讨论,对于其他两种规范,我们的讨论和代码具有相同的意义。关于Netscape cookie草案的细节,大家可以参照Netscape官方站点,这里我们列举一些和我们讨论有关的内容。

根据Netscape cookie草案的描述,Cookie 是Web 服务器向用户的浏览器发送的一段ASCII码文本。一旦收到Cookie,浏览器会把Cookie的信息片断以"名/值"对(name-value pairs)的形式储存保存在本地。这以后,每当向同一个Web 服务器请求一个新的文档时,Web 浏览器都会发送之站点以前存储在本地的Cookie。创建Cookie的最初目的是想让Web服务器能够通过多个HTTP请求追踪客户。有些复杂的网络应用需要在不同的网页之间保持一致,它们需要这种会话状态的保持能力。

浏览器与Web服务器通过HTTP协议进行通讯,而Cookie就是保存在HTTP协议的请求或者应答头部(在HTTP协议中,数据包括两部分,一部分是头部,由一些名值对构成,用来描述要被传输数据的一些信息。一部分是主体(body),是真正的数据(如HTML页面等))进行传送的。

在HTML文档被发送之前,Web服务器通过传送HTTP 包头中的Set-Cookie 消息把一个cookie 发送到用户的浏览器中。下面是一个遵循Netscape cookie草案的完整的Set-Cookie 头:

Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com; 
expires= Wednesday, 19-OCT-05 23:12:40 GMT; [secure]


Set-Cookie的每个属性解释如下:

  • Customer=huangxp 一个"名称=值"对,把名称customer设置为值"huangxp",这个属性在Cookie中必须有。
  • path=/foo 控制哪些访问能够触发cookie 的发送。如果没有指定path,cookie 会在所有对此站点的HTTP 传送时发送。如果path=/directory,只有访问/directory 下面的网页时,cookie才被发送。在这个例子中,用户在访问目录/foo下的内容时,浏览器将发送此cookie。如果指定了path,但是path与当前访问的url不符,则此cookie将被忽略。
  • domain=.ibm.com 指定cookie被发送到哪台计算机上。正常情况下,cookie只被送回最初向用户发送cookie 的计算机。在这个例子中,cookie 会被发送到任何在.ibm.com域中的主机。如果domain 被设为空,domain 就被设置为和提供cookie 的Web 服务器相同。如果domain不为空,并且它的值又和提供cookie的Web服务器域名不符,这个Cookie将被忽略。
  • expires= Wednesday, 19-OCT-05 23:12:40 GMT 指定cookie 失效的时间。如果没有指定失效时间,这个cookie 就不会被写入计算机的硬盘上,并且只持续到这次会话结束。
  • secure 如果secure 这个词被作为Set-Cookie 头的一部分,那么cookie 只能通过安全通道传输(目前即SSL通道)。否则,浏览器将忽略此Cookie。

一旦浏览器接收了cookie,这个cookie和对远端Web服务器的连续请求将一起被浏览器发送。例如 前一个cookie 被存入浏览器并且浏览器试图请求 URL http://www.ibm.com/foo/index.html 时,下面的HTTP 包头就被发送到远端的Web服务器。

GET /foo/index.html HTTP/1.0
Cookie:customer=huangxp

 

在了解了Cookie协议的一些基本内容之后,让我们看看一次典型的网络浏览过程中浏览器如何识别和处理Cookie:

  • 浏览器对于Web服务器应答包头中Cookie的操作步骤:
    1. 从Web服务器的应答包头中提取所有的cookie。
    2. 解析这些cookie的组成部分(名称,值,路径等等)。
    3. 判定主机是否允许设置这些cookie。允许的话,则把这些Cookie存储在本地。
  • 浏览器对Web服务器请求包头中所有的Cookie进行筛选的步骤:
    1. 根据请求的URL和本地存储cookie的属性,判断那些Cookie能被发送给Web服务器。
    2. 对于多个cookie,判定发送的顺序。
    3. 把需要发送的Cookie加入到请求HTTP包头中一起发送。
### HTTP Cookie 的作用 HTTP Cookie 是一种用于在网络应用程序中存储少量数据的技术。这些数据通常以键值对的形式存在,并且可以在客户端(通常是浏览器)和服务器之间传递。Cookie 主要用于保持用户的会话状态,使得用户无需每次请求都重新提供身份验证信息。 例如,在用户登录网站之后,服务器可以生成一个唯一的标识符并将其作为 Cookie 发送给浏览器。当该用户再次访问同一站点时,浏览器自动发送此 Cookie 给服务器,从而允许服务器识别特定用户的身份[^3]。 ### 设置方法 为了创建一个新的 Cookie 对象,可以通过如下方式实现: ```java // Java Servlet API 中定义的方法来创建新的 Cookie 实例 Cookie cookie = new Cookie("username", "JohnDoe"); ``` 除了指定名称和值外,还可以配置其他属性,如过期时间、路径以及安全性选项等。下面是一个完整的例子展示如何向 HTTP 响应添加自定义的 Cookie: ```java // 创建名为 'user' 的 Cookie 并赋初值为 'John Doe' Cookie userCookie = new Cookie("user", "John Doe"); // 将其有效期设为一天 (86400 秒) userCookie.setMaxAge(86400); // 指定此 Cookie 只能在根目录下有效 userCookie.setPath("/"); // 向响应头追加新创建好的 Cookie response.addCookie(userCookie); ``` 上述代码片段展示了通过 `setMaxAge()` 方法设定 Cookie 生命周期;`setPath()` 则限定了哪些 URL 路径能够接收该 Cookie 数据[^2]。 ### 工作原理 每当客户端发起 HTTP 请求至某域名下的资源时,如果之前已经接收到由该域发出的有效期内 Cookies,则会在此次请求头部附加相应的 Set-Cookie 字段。反之亦然,当 Web 应用程序希望保存某些临时性的或持久化的用户偏好设置时,便可通过 Response Headers 返回带有 Set-Cookie 头部字段的信息给客户端处理[^1]。 一旦设置了 Max-Age 属性后,除非达到预定期限时才会被删除,否则即使关闭浏览器也不会影响已存在的 Cookies 存续情况。此外值得注意的是,出于安全考虑,默认情况下跨站脚本攻击(XSS)防护机制会对敏感操作加以限制,因此建议开发者们谨慎对待涉及个人隐私资料的操作过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值