Ich versuche, Anwendung zu erstellen, die Sitzung mit IDhttp 10.5.7 auf Delphi XE unterstützt, aber die Sitzung immer jedes Mal geändert, wenn ich die Anfrage aufrufen.Sitzung nicht mit Indy 10 IDhttp und Delphi XE
Aber ich benutze den gleichen Code in Delphi 2006 mit Indy 10.1.5 die Sitzung erfolgreich gepflegt, auch wenn ich die Anfrage mehrmals anrufe es nur 1 Sitzung erstellen.
Wie löse ich dieses Problem in 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 mal geklickt ich die Taste, 3-mal neue Sitzung
erstellt
10.5.7 ist sehr alt, die aktuelle Version ist 10.6.2. In jedem Fall ist dies eindeutig ein Cookie-Problem. Das Cookie-Management hat sich seit 10.1.5 und sogar 10.5.7 stark verändert, um den modernen Cookie-Praktiken besser zu folgen. Ihre alten 'TIdHTTP' werden also entweder die Cookies verwerfen oder sie werden nicht zurück an den Server gesendet, weil sie denken, dass sie nicht mit den Anforderungen übereinstimmen. Das würde erklären, warum bei jeder Anfrage neue Sitzungen erstellt werden. Ich kann dieses Problem in 10.6.2 nicht reproduzieren, Sitzungen werden wie erwartet wiederverwendet. –