Wininet中Cookie管理

默认情况下,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。

Wininet中Cookie管理_第1张图片

以上所说的保存动作并不需要应用程序自己调用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。所以解决方案改为利用界面嵌入浏览器显示页面。

你可能感兴趣的:(Wininet中Cookie管理)