默认情况下,Wininet会根据自动的在请求中添加cookie头,并且自动的将返回的Cookie信息添加到Cookie数据库中。Cookie分为两种,持久化Cookie及会话Cookie。持久化Cookie就是带有失效日期的Cookie,根据进程的完整性级别,会被保存到Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies目录或者Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies\Low目录。会话Cookie指保存在内存、只能被创建进程访问的Cookie。
上述情况的一个案例就是访问https://www.baidu.com时的cookie保存处理。IE11访问此网页时会分别在以上两个目录保存cookie,原因是低完整性的IE工作进程访问https://www.baidu.com时保存返回的cookie,而中等完整性级别的IE(浏览器界面进程)也会访问此域名的某个网址,从而保存返回的cookie。
以上所说的保存动作并不需要应用程序自己调用InternetSetCookie,而是Wininet自动完成的。也可以禁用自动的添加或者保存Cookie这种行为,可以在调用HttpOpenRequest时设置INTERNET_FLAG_NO_COOKIES即可。
用户可以调用InternetSetCookie设置Cookie值,调用InternetGetCookie查询Cookie值。以下为从文档中复制的代码
char szURL[256]; // buffer to hold the URL
LPSTR lpszData = NULL; // buffer to hold the cookie data
DWORD dwSize=0; // variable to get the buffer size needed
// Insert code to retrieve the URL.
retry:
// The first call to InternetGetCookie will get the required
// buffer size needed to download the cookie data.
if (!InternetGetCookie(szURL, NULL, lpszData, &dwSize))
{
// Check for an insufficient buffer error.
if (GetLastError()== ERROR_INSUFFICIENT_BUFFER)
{
// Allocate the necessary buffer.
lpszData = new char[dwSize];
// Try the call again.
goto retry;
}
else
{
// Insert error handling code.
}
}
else
{
// Insert code to display the cookie data.
// Release the memory allocated for the buffer.
delete[]lpszData;
}
BOOL bReturn;
// Create a session cookie.
bReturn = InternetSetCookie("http://www.adventure_works.com", NULL,
"TestData = Test");
// Create a persistent cookie.
bReturn = InternetSetCookie("http://www.adventure_works.com", NULL,
"TestData = Test; expires = Sat,01-Jan-2000 00:00:00 GMT");
我需要开发的是一个应用程序,利用用户提供的用户名及密码登录OA,然后访问用户的待办事项并显示,若用户单击某项,调用默认的浏览器打开详情。这里将默认的浏览器暂定为IE,这就涉及到要求应用程序和浏览器处于同一个会话中,而一般情况下客户端是由Cookie代表会话的。上面提到,不同的完整性级别的应用程序保存的Cookie目录是不同的,而IE工作在低完整性级别,所以应用程序为了使自己保存的cookie目录与IE一致,所以可以降低程序的完整性级别,持久化的Cookie就可以被IE访问到了,但是Session Cookie是不能跨进程的,所以为了使服务器认为IE发起的Http请求与应用程序发起的Http请求处于同一会话,我将这些Session Cookie也做了持久化处理,这样IE发起的Http请求就可以使用这些Cookie值了。
我最初测试的时候并没有降低应用程序的完整性级别,而是将生成的Cookie文件放置到低完整性级别Cookie目录中,但是IE访问的使用完全不使用我提供的Cookie文件导致我很困惑,经过调试才发现低完整性级别的IE是不能访问这个普通完整性级别的Cookie文件的。
最开始的想法是用户单击某项后,调用默认的浏览器打开详情。但是调试发现iexplorer进程创建成功,但界面并未显示出来。其原因是应用程序处于低完整性级别时,不是能调用IE打开网页的。只有处于midium或者high的完整性级别时,才可以打开IE。所以解决方案改为利用界面嵌入浏览器显示页面。