Tôi đang cố gắng chuyển mã của tôi từ Delphi 2007 sang Delphi XE (chưa có Cập nhật 1). Vấn đề mà tôi đã vấp phải là dưới Delphi XE Tôi nhận được phản ứng khác nhau từ máy chủ sau khi gửi tin nhắn GET thứ hai.TIdHTTP - phiên đã hết hạn tin nhắn theo Delphi XE
Thư trong HTML được biểu mẫu cho biết phiên của tôi đã hết hạn. Tuy nhiên, cùng một mã hoạt động mà không có bất kỳ vấn đề theo Delphi 2007 cho đến ngày nay. Tôi đã tìm kiếm thông tin trên internet và phát hiện ra rằng tôi nên sử dụng một CookieManager?
Điều này là tôi không sử dụng bất kỳ trong Delphi 2007 và khi tôi gán một trong Delphi XE kết quả của mã của tôi đã không thay đổi. Tôi vẫn nhận được thông báo về phiên hết hạn.
Tôi còn có thể thử những gì khác?
Cập nhật: Tôi đã tìm thấy một số thông tin rằng Indy 10 gặp sự cố với cookie nhưng chúng đã được khắc phục.
Tôi đã tải xuống ảnh chụp Indy10_4722, tiếc là lỗi vẫn xảy ra.
Cập nhật 2 - Mã số được cung cấp
Vì vậy, tôi đã chuẩn bị một mã ví dụ. Điều này tương thích với cả Delphi (2007 và XE). Tuy nhiên để biên dịch nó vào năm 2007, bạn cần phải có GraphicEx library.
Mã đang kết nối với máy chủ thực, tải hình ảnh bảo mật và hiển thị một biểu mẫu. Viết lại các chữ cái từ hình ảnh vào hộp soạn thảo và đóng biểu mẫu. Đó là tất cả những gì bạn cần làm để kiểm tra nó.
program IndyTest;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Contnrs, Menus, ExtCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
{$IFDEF VER220}PngImage{$ELSE}GraphicEx{$ENDIF}, StrUtils;
{$R *.res}
procedure LoadSecurityImage(AImage: TImage; AIdHTTP: TIdHTTP; AImgLink: String);
var
PNGGraphic: {$IFDEF VER220}TPngImage{$ELSE} TPNGGraphic{$ENDIF};
ResponseStream: TMemoryStream;
begin
ResponseStream := TMemoryStream.Create;
PNGGraphic := {$IFDEF VER220}TPngImage.Create{$ELSE}TPNGGraphic.Create{$ENDIF};
try
AIdHTTP.Get(AImgLink, ResponseStream);
ResponseStream.Position := 0;
PNGGraphic.LoadFromStream(ResponseStream);
AImage.Picture.Assign(PNGGraphic);
finally
ResponseStream.Free;
PNGGraphic.Free;
end;
end;
function GetImageLink(AIdHTTP: TIdHTTP): String;
var
WebContentStream: TStringStream;
Index, Index2: Integer;
begin
Result := '';
WebContentStream := TStringStream.Create('');
try
AIdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
AIdHTTP.Get('http://czat.wp.pl/i,1,chat.html', WebContentStream);
Index := Pos('id="secImg">', WebContentStream.DataString);
if Index > 0 then
begin
Index := PosEx('src="', WebContentStream.DataString, Index) + 5;
Index2 := PosEx('">', WebContentStream.DataString, Index);
if Index > 10 then
begin
Result := Copy(WebContentStream.DataString, Index, Index2 - Index);
end;
end;
finally
WebContentStream.Free;
end;
end;
procedure CheckForContent(const ANick, AImageSeed: String; AIdHTTP: TIdHTTP);
var
WebContent: TStringStream;
S: String;
begin
WebContent := TStringStream.Create('');
try
AIdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
S := 'http://czat.wp.pl/chat.html?i=31179&auth=nie&nick=' + ANick
+ '®ulamin=tak&simg=' + AImageSeed + '&x=39&y=13';
AIdHTTP.Get(S, WebContent);
if Pos('<div class="applet">', WebContent.DataString) > 0 then
ShowMessage('It works properly.')
else if Pos('<div id="alert">Sesja wygas', WebContent.DataString) > 0 then
ShowMessage('Session expired')
else
ShowMessage('Unknown result.');
finally
WebContent.Free;
end;
end;
var
LogForm: TForm;
SecurityImage: TImage;
Edit: TEdit;
IdHTTPWp: TIdHTTP;
begin
Application.Initialize;
IdHTTPWp := TIdHTTP.Create(Application);
IdHTTPWp.AllowCookies := True;
IdHTTPWp.HandleRedirects := True;
IdHTTPWp.HTTPOptions := [hoForceEncodeParams];
LogForm := TForm.Create(Application);
LogForm.Position := poScreenCenter;
SecurityImage := TImage.Create(LogForm);
SecurityImage.Parent := LogForm;
SecurityImage.AutoSize := True;
Edit := TEdit.Create(LogForm);
Edit.Parent := LogForm;
Edit.Top := 64;
LoadSecurityImage(SecurityImage, IdHTTPWp, GetImageLink(IdHTTPWp));
LogForm.ShowModal;
CheckForContent('TestUser', Edit.Text, IdHTTPWp);
Application.Run;
end.
Cập nhật 3
gói dữ liệu cho Delphi 2007 Ví dụ are here.
Gói dữ liệu cho ví dụ xe Delphi are here.
Chương trình miễn phí để phân tích gói SmartSniff.
Cảm ơn.
Ok tôi sẽ làm, nhưng bạn nên trả lời câu hỏi của tôi! ;-) – Wodzu
'TIdHTTP' sử dụng một đối tượng ẩn' TIdCookieManager' trong nội bộ nếu bạn không tự cung cấp. Ảnh chụp nhanh cũ hơn của Indy 10 có một số vấn đề liên quan đến cookie, nhưng ảnh chụp nhanh hiện đại có hệ thống xử lý cookie được thiết kế hoàn toàn dựa trên RFC cookie mới được phát hành vào năm 2011 và theo tôi biết là hoạt động chính xác cho hầu hết các hệ thống đã biết.Nếu bạn cho rằng bạn vẫn gặp vấn đề về cookie, thì chúng tôi cần xem cookie thực tế và lưu lượng truy vấn/yêu cầu HTTP được liên kết xung quanh chúng để chúng tôi có thể thấy khi nào cookie không được gửi trở lại máy chủ. –
Cảm ơn bạn, hôm nay tôi sẽ cung cấp một ví dụ làm việc đầy đủ và ví dụ không làm việc đầy đủ để so sánh. – Wodzu