Поделиться через


Управление файлами cookie

По протоколу HTTP сервер или скрипт используют файлы cookie для хранения сведений о состоянии на клиентской рабочей станции. Функции WinINet реализовали для этой цели постоянную базу данных cookie. Их можно использовать для установки файлов cookie в и доступа к файлам cookie из базы данных cookie. Дополнительные сведения см. в разделе Файлы cookie HTTP.

Для управления файлами cookie можно использовать функции InternetSetCookie и InternetGetCookie .

Следующие функции позволяют приложению создавать или извлекать файлы cookie в базе данных cookie.

Функция Описание
InternetGetCookie Извлекает файлы cookie для указанного URL-адреса и всех его родительских URL-адресов.
InternetSetCookie Задает файл cookie по указанному URL-адресу.

 

Обратите внимание, что для этих функций не требуется вызов InternetOpen. Файлы cookie с датой окончания срока действия хранятся в учетной записи локальных пользователей в папке Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies и в каталоге Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies\Low для приложений, работающих с низкими привилегиями. Файлы cookie без даты окончания срока действия хранятся в памяти и доступны только для процесса, в котором они были созданы.

Как указано в разделе Файлы cookie HTTP , функция InternetGetCookie не возвращает файлы cookie, помеченные сервером как некриптуируемые с помощью атрибута "HttpOnly" в заголовке Set-Cookie.

InternetGetCookie возвращает файлы cookie для указанного URL-адреса и всех его родительских URL-адресов.

В следующем примере показан вызов InternetGetCookie.

TCHAR szURL[256];         // buffer to hold the URL
LPTSTR 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 TCHAR[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;
}

InternetSetCookie используется для задания файла cookie по указанному URL-адресу. InternetSetCookie может создавать как постоянные, так и сеансовые файлы cookie.

Постоянные файлы cookie имеют дату окончания срока действия. Эти файлы cookie хранятся в учетной записи локальных пользователей в папке Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies и в каталоге Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies\Low для приложений, работающих с низкими привилегиями.

Файлы cookie сеанса хранятся в памяти и доступны только созданному процессу.

Данные для файла cookie должны иметь следующий формат:

NAME=VALUE

Для даты окончания срока действия формат должен быть следующим:

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

ДЕНЬ — это трехбуквенное сокращение для дня недели, ДД — день месяца, МММ — это трехбуквенное сокращение месяца, ГГГГ — год, а ЧЧ:ММ:СС — время дня в военном времени.

В следующем примере показаны два вызова InternetSetCookie. Первый вызов создает файл cookie сеанса, а второй — постоянный файл cookie.

BOOL bReturn;

// Create a session cookie.
bReturn = InternetSetCookie(TEXT("https://www.adventure_works.com"), NULL,
            TEXT("TestData = Test"));

// Create a persistent cookie.
bReturn = InternetSetCookie(TEXT("https://www.adventure_works.com"), NULL,
           TEXT("TestData = Test; expires = Sat,01-Jan-2000 00:00:00 GMT"));

Примечание

WinINet не поддерживает реализации сервера. Кроме того, его не следует использовать из службы. Для серверных реализаций или служб используйте службы Microsoft Windows HTTP (WinHTTP).