2017-06-28 6 views
0

J'essaie de créer une application prenant en charge la session en utilisant idhttp 10.5.7 sur Delphi XE, mais la session est toujours modifiée chaque fois que j'appelle la requête.Session non gérée avec indy 10 idhttp et Delphi XE

Mais ensuite j'utilise le même code dans Delphi 2006 en utilisant indy 10.1.5 la session s'est bien maintenue, même quand j'appelle la requête plusieurs fois, elle ne crée qu'une seule session.

Comment résoudre ce problème dans Delphi XE?

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, IdCookieManager, IdBaseComponent, IdComponent, IdTCPConnection, 
    IdTCPClient, IdHTTP, StdCtrls,iduri,IdCookie; 

type 
    TForm1 = class(TForm) 
    HTTP: TIdHTTP; 
    Button1: TButton; 
    Memo1: TMemo; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    function get_dataweb(url: string): string; 
    procedure OnNewCookie(ASender: TObject; ACookie: TIdCookieRFC2109; var VAccept: Boolean); 
    { Private declarations } 
    public 
     Stream : TStringStream; 
     cookie : TIdCookieManager; 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var hasil : string; 
begin 
    hasil := get_dataweb('http://localhost/web/tes.php'); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Stream := TStringStream.Create; 
    cookie := TIdCookieManager.Create; 
    cookie.OnNewCookie := OnNewCookie; 
    HTTP.CookieManager := cookie; 

end; 

procedure TForm1.OnNewCookie(ASender: TObject; ACookie: TIdCookieRFC2109; var VAccept: Boolean); 
begin 
    memo1.Lines.Add(ACookie.CookieText); 
end; 

function TForm1.get_dataweb(url:string):string; 
var hasil : string; 
begin 

    stream.Position  := 0; 
    stream.Size   := 0; 

    http.AllowCookies  := True; 
    http.HandleRedirects := True; 
    HTTP.ReadTimeout  := 0; 
    HTTP.ConnectTimeout := 0; 

    HTTP.Request.CustomHeaders.clear; 
    HTTP.Request.CustomHeaders.Add('user:user'); 
    HTTP.Request.CustomHeaders.Add('password:password'); 
    HTTP.request.useragent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'; 

    try 
    http.get(url,Stream); 
    hasil := Stream.DataString; 
    except 

    on E: EIdHTTPProtocolException do 
    begin 
     hasil := E.ErrorMessage; 
     result := hasil; 
     exit; 
    end; 
    on E: Exception do 
    begin 
     ShowMessage('Failed, ' + E.Message + #13#10 + ' ' + hasil); 
    end; 
    end; 

    result := hasil; 
end; 


end. 

3 fois i cliqué sur le bouton, 3 fois nouvelle session créé

3 times i clicked the button, 3 times new session created

+0

10.5.7 est très vieux, la version actuelle est 10.6.2. En tout cas, c'est clairement un problème de cookie. La gestion des cookies a beaucoup changé depuis 10.1.5 et même 10.5.7, pour suivre de plus près les pratiques de cookies modernes. Il y a donc de fortes chances que votre ancien TIdHTTP rejette les cookies ou ne les renvoie pas au serveur, car il pense qu'ils ne correspondent pas aux requêtes en cours. Cela expliquerait pourquoi de nouvelles sessions sont créées sur chaque requête. Je ne suis pas capable de reproduire ce problème dans 10.6.2, les sessions sont réutilisées comme prévu. –

Répondre

0

Merci pour la suggestion Remy, je l'ai mis à jour mon Indy à 10.6.2 et le problème résolu. J'ai suivi this tutoriel avec succès