2012-01-27 5 views
6

Devo navigare in un determinato sito che mantiene un ID di sessione con idhttp di indy.Cookie di sessione con indy

Uso il seguente codice per inizializzare i componenti necessari.

procedure InitSession; 
begin 
    Initalized := True; 
    try 
    ihttp := TIdHTTP.Create(nil); //the variables are declared globally 
    idCookie := TIdCookieManager.Create(nil); 
    ihttp.ConnectTimeout := 5000; 
    ihttp.AllowCookies := true; 
    ihttp.HandleRedirects := true; 
    ihttp.CookieManager := idCookie; 
    except 
    Initalized := False; 
    end; 
end; 

Il problema è quando sto facendo una richiesta che il cookie non viene inviato. Cosa devo fare per inviare il cookie witch contiene l'ID della sessione. Grazie

+1

È necessario specificare la versione di Indy che si sta utilizzando, poiché la funzionalità è cambiata (a volte in modo drammatico) tra le versioni. Quindi, come fare le cose può cambiare drasticamente. –

+1

Mi raccomando di provare la versione attuale di Indy da Subversion o le istantanee giornaliere – mjn

risposta

6

Se un cookie non viene reinviato in nuove richieste, allora TIdCookieManager ha rifiutato il cookie quando è stato ricevuto o non corrisponde al cookie accettato per le nuove richieste. Puoi mostrare l'effettiva intestazione di risposta Set-Cookie che sta inviando i cookie e gli URL che ritieni che i cookie non vengano reinviati correttamente? Hai verificato che dopo aver ricevuto un cookie, in realtà finisce nello TIdCookieManager prima di inviare una nuova richiesta?

Quale versione di Indy stai usando? Prima del 2011, le versioni precedenti di Indy 10 avevano interrotto la gestione dei cookie che era sostanzialmente inutilizzabile. Ma all'inizio del 2011, IdCookieManager.pas e IdCookie.pas sono stati completamente riscritti da zero, e da maggio 2011 in poi hanno funzionato correttamente e non ho visto nuovi rapporti di maltrattamento dei cookie.

+0

Sto usando Delphi XE 2 ... quindi quando uso il metodo ihttp.Get() il cookie deve essere inviato automaticamente o devo impostarlo manualmente? Il cookie viene ricevuto correttamente nel gestore dei cookie. come posso farlo grazie? – opc0de

+0

ho provato questo ihttp.Request.CustomHeaders.Add ('Cookie:' + idcookie.CookieCollection.Cookies [0] .ClientCookie); ma senza successo – opc0de

+0

I cookie vengono gestiti automaticamente. Di nuovo, che aspetto ha l'intestazione 'Set-Cookie' del server che sta ricevendo il cookie? È possibile ottenere tale valore dalla proprietà 'TIdHTTP.Response.RawHeaders'. Quale URL stai richiedendo in seguito che non sta restituendo i cookie? Ho bisogno di queste informazioni per determinare se Indy funziona correttamente o se si tratta di un bug nel codice di gestione dei cookie riprogettato. –

0

C'è un problema con i cookie che non hanno una proprietà DOMAIN? L'IdCookie fornito con DXE2 non analizza i cookie che NON hanno una proprietà MAX-AGE, hanno una proprietà EXPIRES e NON hanno una proprietà DOMAIN. Vedere IdCookie.pas 675 per dove S sembra avere un valore inatteso (rimasto dall'analisi della proprietà expires).