发现 ISAPI 使用 Cookies

分享于 

8分钟阅读

Web开发

  繁體

Sample Image

介绍

本文提供了一种从ISAPI扩展向客户端浏览器发送一些cookie的方法。 还提供了一种检索和可视化 Cookies的简单方法。

什么是 cookie用于将持久状态信息存储在用户计算机上的小信息包。 Cookies 是在HTTP协议下,服务器或者脚本可以维护客户机工作站上的状态信息。

Cookie header 包含在任何具有它的域和路径 MATCHES 请求的Cookie的HTTP请求中。

HTTP Cookies 为服务器提供了一种机制,用于存储和检索应用程序的客户端系统上的状态信息。 这种机制允许基于web的应用程序,能够存储有关所选项目。用户偏好。注册信息以及以后可以检索的其他信息的信息。

cookie相关标头

有两个与 Cookies 相关的HTTP头和 Cookie。 由服务器发送集成 cookie header,响应HTTP请求,用于在用户系统上创建 cookie。 如果客户端应用程序有一个匹配域和路径,则客户端应用程序将 Cookie header 包含在发送到服务器的HTTP请求中。

设置cookie标题

set cookie响应 header 使用以下格式:

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

必须包含一个或者多个遵循 Pattern <name>=<value>的字符串序列( 用分号分隔),该字符串必须包含在设置cookie响应 header 中。 服务器可以使用这些字符串序列在客户机的系统上存储数据。

过期日期是使用格式 expires=<date> 设置的,它的中 <date> 是格林格林平均时间( GMT ) 中的过期日期。 如果未设置到期日期,则在Internet会话结束后cookie过期。 否则,cookie将一直保存在缓存中,直到过期日期。 日期必须遵循格式 DAY, DD-MMM-YYYY HH:MM:SS GMT 在 military DAY的日期,DD 是月(。在本月的第一天,例如 01 )的日期,MMM 是月份的三个字母缩写,YYYY 是military的缩写,( 22将为 10: 00 P.M,例如) 是军事时间的缩写,是第二个值。

使用 Pattern domain=<domain_name> 指定域 NAME 是可选的,并且用于持久化 Cookies,用于指示cookie有效的域的结尾。 指定域的会话 Cookies 被拒绝。 如果指定的域 NAME 结束 MATCHES 请求,cookie将尝试对路径进行 MATCH 以确定是否应该发送该 cookie。 例如,如果域 NAME 结束为 .microsoft.com,将检查对 home.microsoft.comsupport.microsoft.com的请求,以查看指定的Pattern MATCHES 是否请求。 域 NAME 必须至少有两个或者三个周期,以防止 Cookies 被设置为广泛使用的域 NAME 结尾,如 .com.educo.jp。 允许的域名与 .microsoft.com.someschool.edu.someserver.co.jp 相似。 只有指定域内的主机才能为域设置 cookie。

使用 Pattern path=<some_path> 设置路径是可选的,可以用于指定该cookie有效的统一资源定位器( url )的子集。 如果指定了路径,则对于 MATCHES 路径的任何请求,cookie都被认为是有效的。 例如如果指定路径为 /example,则带有路径 /examplecode/example/code.htm的请求将 MATCH。 如果未指定路径,则假定路径是与设置cookie标头关联的资源的路径。

cookie也可以标记为安全,它指定cookie只能发送到HTTPS服务器。

Cookie头

Cookie header 包含在任何具有它的域和路径 MATCHES 请求的Cookie的HTTP请求中。 Cookie header 具有以下格式:

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

使用格式 <name>=<value>的一个或者多个字符串序列包含在cookie中设置的信息。

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

存储 Cookies

虽然Netscape从服务器捕获相同的材质,但它以不同的方式存储了来自于 IE的Cookies。 不是将每个cookie存储在它自己的文件中,就像 IE 所做的那样,

使用指定的inside ( 如果你使用 Nav3,cookies.txt 通常在 C:Program FilesNetscapeNav3目录中),则Nav4存储它的Cookies,在我的示例中为 C:Program FilesNetscapeUsersuser。

功能

在浏览器上加载默认的方法,一个简单的表单,用户可以放置它想要的cookie名/值对。 所有作业均以 GetCookie 方法完成。 要在客户端计算机上写入cookie值,必须通知IIS服务器不要编写自己的标头:

//Turn off sending header by MFC.pCtxt->m_bSendHeaders = FALSE;

将在客户端计算机上使用 ServerSupportFunction HTTP函数将包含 Cookies的标头写在客户端计算机上:

// Send our own headers.if (!pCtxt->ServerSupportFunction (HSE_REQ_SEND_RESPONSE_HEADER,
 NULL, &dwSize, (LPDWORD ) szHeaders))
{
 ISAPITRACE1 ("ServerSupportFunction failed: %dn",
 GetLastError()); // Report an error.return;
}

HTML表单中的参数值将使用 POST HTTP数据传输接收到 GetCookie 方法,并在客户端之后写入。

//add the user input cookie//attention, the entry name in //vector collection is"DATA"bstrToken = L"DATA"; 
index = vecServerCtx.Find(bstrToken);if (index > -1)
{
 //get a map list from the POST data values map = vecServerCtx[index].GetValueAsMap(); 
 if(!map.empty())
 {
 //get the current parameter name bstrFormCookieName = map[L"FormCookieName"]; 
 //get the current parameter value bstrFormCookieValue = map[L"FormCookieValue"];
 wsprintf(szHeader, "Set-Cookie: %s=%srn", 
 (LPCTSTR)bstrFormCookieName, 
 (LPCTSTR)bstrFormCookieValue);
 //add that cookie to the header list strcat(szHeaders, szHeader);
 }
}

例如 GetCookie 方法中的考虑写入另一个 2 Cookies,一个简单的和具有时间过期的。

浏览器将在浏览器上显示来自服务器上下文向量集合的实际客户端cookie值,

Cookies 单独的值,来自 Cookies 映射集合的单个值,

从表单接收到的POST数据。 同样,映射集合用于访问各个参数值。

最后将HTML表单重新写入浏览器,这样用户就可以输入/修改 cookie。

//output again the form to input another cookie dwLen = strForm.GetLength();
 pCtxt->WriteClient( (void*)(LPCTSTR)strForm, &dwLen, 0);

本文还提供了一个使服务器重定向的功能。


disco  discover  cookie  ISA  Cookies  Isapi  
相关文章