HTTP Cookies

HTTP Cookie 为服务器提供了一种机制,用于存储和检索客户端应用程序系统上的状态信息。 此机制允许基于 Web 的应用程序能够存储有关选定项目、用户首选项、注册信息以及日后检索的其他信息。

有两个标头(Set-Cookie 和 Cookie)与 Cookie 相关。 Set-Cookie 标头由服务器发送,以响应 HTTP 请求,该请求用于在用户的系统上创建 Cookie。 如果存在具有匹配域和路径的 Cookie,则客户端应用程序将包含发送到服务器的 HTTP 请求。

Set-Cookie 响应标头使用以下格式:

Set-Cookie: <name>=<value>[; <name>=<value>]...
[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure][; httponly]

在 Set-Cookie 响应标头中必须包含一个或多个遵循模式名称=值的字符串序列(用分号分隔)。 服务器可以使用这些字符串序列在客户端的系统上存储数据。

到期日期使用格式 expires=date 设置,其中日期是格林威治标准时间 (GMT) 的到期日期。 如果未设置到期日期,Cookie 将在 Internet 会话结束后过期。 否则,Cookie 将保留在缓存中,直至到期日期。 日期必须使用以下格式:

DAY, DD-MMM-YYYY HH:MM:SS GMT

DAY

一周中的某天(星期日、星期一、星期二、星期二、星期三、星期四、星期五、星期六)。

DD

一个月中的某天(如 01 为某月的第一天)。

MMM

月份的缩写(1 月、2 月、3 月、4 月、5 月、6 月、7 月、8 月、9 月、10 月、11 月、12 月)。

YYYY

年份。

HH

例如,军事时间的小时值(例如,22 表示晚上 10:00)。

MM

分钟值。

SS

第二个值。

使用 domain=domain_name 模式指定域名对于持久性 Cookie 是可选的,用于指示 Cookie 有效域的末尾。 指定域的会话 Cookie 将被拒绝。 如果指定的域名结尾与请求匹配,Cookie 将尝试匹配路径,以确定是否应发送 Cookie。 例如,如果域名结尾为 .microsoft.com,则会检查对 home.microsoft.com 和 support.microsoft.com 的请求是否与请求匹配。 域名必须至少有两个或三个句点,以防止为广泛使用的域名结尾(如 .com、.edu 和 co.jp)设置 Cookie。 允许的域名类似于 .microsoft.com、.someschool.edu 和 .someserver.co.jp。 只有指定域中的主机才能为域设置 Cookie。

使用 path=some_path 的模式设置路径是可选的,可用于指定 Cookie 有效 URL 的子集。 如果指定了路径,则 Cookie 对于与该路径匹配的任何请求都有效。 例如,如果指定的路径为 /example,则具有路径 /examplecode 和 /example/code.htm 的请求将会匹配。 如果未指定路径,则假定该路径是与 Set-Cookie 标头关联资源的路径。

Cookie 还可以标记为安全,它指定只能将 Cookie 发送到 https 服务器。

最后,Cookie 可以标记为 HttpOnly(属性不区分大小写),以表明 Cookie 不可编写脚本,出于安全原因不应向客户端应用程序显示。 在 Windows Internet 中,这意味着无法通过 InternetGetCookie 函数检索 Cookie。

Cookie 标头包含在具有其域和路径与请求匹配的 Cookie 的任何 HTTP 请求中。 Cookie 标头的格式如下:

Cookie: <name>=<value> [;<name>=<value>]...

一个或多个字符串序列(使用格式名称=)包含 Cookie 中设置的信息。

生成 Cookie

有三种方法可用于为 Microsoft Internet Explorer 生成 Cookie:使用 Microsoft JScript、使用 WinINet 函数和使用 CGI 脚本。 所有方法都需要设置 Set-Cookie 标头中包含的信息。

使用动态 HTML (DHTML) 对象模型,可以通过调用 文档对象的 Cookie 属性来设置 Cookie,如以下示例所示。

<SCRIPT language="JavaScript">
<!--
    document.cookie = "SomeValueName = Some_Value";
-->
</SCRIPT>

可以使用 InternetSetCookie 函数的应用程序创建 Cookie。 有关详细信息,请参阅设置 Cookie

Cookie 是通过将 Set-Cookie 标头作为 CGI 脚本的一部分包含在对请求的 HTTP 响应中来生成的。

以下示例是一个 CGI 脚本,其中包含使用 Perl 的 Set-Cookie 标头。

print "Set-Cookie:Test=test_value; 
      expires=Sat, 01-Jan-2000 00:00:00 GMT;
      path=/;"

注意

WinINet 不支持服务器实现。 此外,它不应从服务中使用。 对于服务器实现或服务,请使用Microsoft Windows HTTP 服务 (WinHTTP))。