Condividi tramite


Gestione dei cookie in WinHTTP

I dati della sessione HTTP vengono passati tra il client e il server nell'intestazione cookie della richiesta o della risposta. Il server invia cookie al client nell'intestazione Set-cookie della risposta e l'API WinHTTP invia nuovamente il cookie del server al server nell'intestazione del cookie della richiesta. Le specifiche di gestione dei cookie, descritte in rfc 2109 (meccanismo di gestione dello stato HTTP), vengono implementate per impostazione predefinita in WinHTTP. Le specifiche di gestione dei cookie recenti, descritte in rfc 2964, non sono supportate da WinHTTP.

WinHTTP ottiene il cookie dall'intestazione del server Set-Cookie e lo archivia in una cache per singola sessione. Questo cookie viene reinviato nelle richieste successive nella stessa sessione WinHTTP in cui la destinazione corrisponde all'origine del cookie. L'API WinHTTP rigenera l'intestazione del cookie di richiesta per ogni fase della richiesta.

L'elenco seguente descrive diverse opzioni che le applicazioni client WinHTTP possono usare per gestire i cookie:

  • Gestione automatica dei cookie: WinHTTP gestisce automaticamente i cookie e l'applicazione client non esegue alcuna gestione personalizzata dei cookie.
  • Disabilita gestione automatica dei cookie: la gestione automatica dei cookie nell'API WinHTTP è disabilitata e non vengono inviati cookie.
  • Specificare manualmente tutti i cookie: la gestione automatica dei cookie è disabilitata e l'applicazione client aggiunge o rimuove tutte le intestazioni di cookie per ogni richiesta nella sessione.
  • Gestione manuale e automatica dei cookie: combinare la gestione automatica e manuale dei cookie.

Per disabilitare la gestione dei cookie, l'applicazione client WinHTTP chiama la funzionewinHttpSetOptioncon il parametro dwOption impostato su WINHTTP_OPTION_DISABLE_FEATUREe il parametro lpBuffer impostato su WINHTTP_DISABLE_COOKIES. Il parametro hInternet deve essere un handle di richiesta. Quando la gestione dei cookie è disabilitata in un handle di richiesta che ha inviato una richiesta precedente, il client deve rimuovere manualmente le intestazioni dei cookie di richiesta esistenti con il WinHttpAddRequestHeaders funzione prima di inviare la richiesta successiva. Per altre informazioni, vedere Rimozione di intestazioni di cookie.

Nota

L'applicazione client deve impostare tutti i cookie nella sessione dopo che la modalità automatica è stata disabilitata.

Specificare manualmente tutti i cookie

Quando la gestione automatica dei cookie è disabilitata, l'applicazione client WinHTTP ha la possibilità di specificare manualmente tutti i cookie. Per impostare manualmente il cookie, l'applicazione chiama WinHttpAddRequestHeaders specificando l'intestazione del cookie nel parametro pwszHeaders. L'applicazione client deve cancellare tutte le intestazioni di cookie prima di inviare nuovamente la richiesta.

L'applicazione client deve anche modificare l'intestazione del cookie quando la richiesta è stata reindirizzata. Per modificare il cookie nelle richieste reindirizzate, il client specifica una funzione di callback con WinHttpSetStatusCallback che risponde al caso di callback di reindirizzamento. Il gestore di callback deve cancellare il cookie inviato in precedenza alla richiesta chiamando WinHttpAddRequestHeaders. Per altre informazioni sulla rimozione delle intestazioni di cookie, vedere Rimozione di intestazioni di cookie.

Le applicazioni client WinHTTP possono combinare il meccanismo di gestione automatica dei cookie WinHTTP con la gestione manuale dei cookie. L'applicazione aggiunge cookie personalizzati all'intestazione del cookie generata automaticamente prima di inviare la richiesta con la funzioneWinHttpSendRequest. Il cookie personalizzato deve essere il primo cookie nell'intestazione della richiesta affinché l'API WinHTTP possa memorizzare correttamente il cookie nella cache. L'applicazione client deve anche rimuovere i cookie inviati alle richieste precedenti prima di inviare nuovamente una richiesta sullo stesso handle di richiesta. Per ulteriori informazioni, vedere la rimozione delle Cookie Headers.

I cookie aggiunti a una richiesta prima della chiamata a WinHttpSendRequest sono inclusi in tutte le richieste WinHTTP inviate per conto del successivo WinHttpSendRequest e WinHttpReceiveResponse chiamate. L'applicazione client potrebbe dover cancellare l'intestazione del cookie quando la richiesta è stata reindirizzata. Per cancellare il cookie nelle richieste reindirizzate, il client specifica una funzione di callback con WinHttpSetStatusCallback che risponde al caso di callback di reindirizzamento. Il gestore di callback deve cancellare il cookie inviato in precedenza nella richiesta chiamando WinHttpAddRequestHeaders. La funzione di callback potrebbe non impostare nuovi cookie personalizzati sul callback di reindirizzamento. Il client deve attendere il completamento di WinHttpReceiveResponse prima di aggiungere nuovi cookie per la successiva chiamata WinHttpSendRequest.

L'applicazione client WinHTTP potrebbe dover cancellare il cookie di richiesta esistente prima di inviare nuovamente una richiesta per impedire che i cookie inviati alle richieste precedenti vengano inviati nuovamente alla richiesta corrente; per altre informazioni, vedere la nota seguente. Ricorda inoltre che i cookie non devono essere cancellati prima dell'invio della prima richiesta sul gestore della richiesta. Il client può cancellare i cookie esistenti chiamando WinHttpAddRequestHeaders con un'intestazione di cookie vuota nel parametro pwszHeaders e il flag WINHTTP_ADDREQ_FLAG_REPLACE impostato nel parametro dwModifier. Nell'esempio di codice seguente viene illustrato come cancellare l'intestazione del cookie nella richiesta.

WinHttpAddRequestHeaders(hRequest, 
                         L"Cookie:", 
                         -1, 
                         WINHTTP_ADDREQ_FLAG_REPLACE);

L'API WinHTTP ha comportamenti di gestione dei cookie diversi per le versioni del sistema operativo precedenti a Windows XP con Service Pack 2 (SP2) e Windows Server 2003 con Service Pack 1 (SP1).

**Windows XP con SP2 e versioni successive e Windows Server 2003 con SP1 e versioni successive: **

L'API WinHTTP cancella tutti i cookie inviati con richieste precedenti per l'handle della richiesta. Il client può aggiungere manualmente nuove intestazioni di cookie prima di ogni chiamata a WinHttpSendRequest. Se la funzionalità di gestione automatica dei cookie dell'API WinHTTP non è stata disabilitata, l'API WinHTTP aggiungerà la nuova intestazione del cookie (o aggiungerà una nuova intestazione di cookie se l'applicazione client non ne ha aggiunta una manualmente) con il cookie dal server.

**Windows XP con SP2 e Windows Server 2003 con SP1: **

L'API WinHTTP non cancella l'intestazione del cookie di richiesta dopo che WinHttpReceiveResponse è completato. I cookie inviati nelle richieste precedenti verranno reinviati nelle chiamate successive a WinHttpSendRequest. L'applicazione client WinHTTP deve cancellare l'intestazione dei cookie esistente prima di inviare nuovamente una richiesta tramite l'handle della richiesta.