2012-01-02 36 views
11

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 
     + '&regulamin=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.

+0

Ok tôi sẽ làm, nhưng bạn nên trả lời câu hỏi của tôi! ;-) – Wodzu

+3

'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ủ. –

+0

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

Trả lời

1

Tôi nghĩ bạn nên cân nhắc việc kiểm tra yêu cầu bằng cách sử dụng một số công cụ như httpanalyzer hoặc fiddler.

Sử dụng Internet Explorer lần đầu tiên và xem yêu cầu đó như thế nào.

Sau đó, sử dụng ứng dụng của bạn và so sánh cả hai yêu cầu. Nếu nó là một vấn đề cookie, bạn sẽ thấy những gì là sai.

Giữ sống không phải là bạn trả lời. Nó chỉ làm cho bạn kết nối để không được giảm trên mỗi yêu cầu đến cùng một máy chủ. Xem Wikipedia

Các vấn đề liên quan