2012-01-27 28 views
6

Tôi phải duyệt một trang web nhất định giữ id phiên với idhttp của người dùng.Cookie phiên có indy

tôi sử dụng mã sau để initalize các thành phần tôi cần.

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; 

Vấn đề là khi tôi yêu cầu cookie không được gửi. Tôi cần phải làm gì để gửi phù thủy cookie chứa id phiên. Cảm ơn

+1

Bạn cần chỉ định phiên bản Indy bạn đang sử dụng, vì chức năng đã thay đổi (đôi khi đáng kể) giữa các phiên bản. Làm thế nào để làm những điều do đó có thể thay đổi đáng kể là tốt. –

+1

Tôi khuyên bạn nên thử phiên bản Indy hiện tại từ Subversion hoặc ảnh chụp nhanh hàng ngày – mjn

Trả lời

6

Nếu cookie không được gửi lại trong yêu cầu mới thì TIdCookieManager đã từ chối cookie khi nhận được hoặc không khớp cookie được chấp nhận với yêu cầu mới. Bạn có thể hiển thị (các) tiêu đề phản hồi thực tế Set-Cookie đang gửi cookie và (các) URL mà bạn cho rằng (các) cookie không được gửi lại chính xác không? Bạn đã xác minh rằng sau khi nhận được cookie, nó thực sự kết thúc trong TIdCookieManager trước khi gửi yêu cầu mới?

Bạn đang sử dụng phiên bản Indy nào? Trước năm 2011, các bản phát hành trước đó của Indy 10 đã bị xử lý cookie bị hỏng mà về cơ bản không sử dụng được. Nhưng vào đầu năm 2011, IdCookieManager.pasIdCookie.pas đã được viết lại hoàn toàn từ đầu và từ tháng 5 năm 2011 trở đi đã hoạt động bình thường và tôi chưa thấy bất kỳ báo cáo mới nào về xử lý sai cookie.

+0

Tôi đang sử dụng Delphi XE 2 ... vì vậy khi tôi sử dụng phương thức ihttp.Get(), cookie sẽ được gửi tự động hoặc tôi phải đặt thủ công? Cookie được nhận đúng cách trong trình quản lý cookie. làm thế nào tôi có thể làm điều đó nhờ? – opc0de

+0

tôi đã thử ihttp.Request.CustomHeaders.Add ('Cookie:' + idcookie.CookieCollection.Cookies [0] .ClientCookie); nhưng không thành công – opc0de

+0

Cookie được xử lý tự động. Một lần nữa, tiêu đề 'Set-Cookie' của máy chủ trông như thế nào đang nhận cookie? Bạn có thể nhận được giá trị đó từ thuộc tính 'TIdHTTP.Response.RawHeaders'. Bạn đang yêu cầu URL nào sau đó không gửi lại cookie? Tôi cần thông tin này để xác định xem Indy có đang hoạt động chính xác không hoặc nếu đây là lỗi trong mã quản lý cookie được thiết kế lại. –

0

Có vấn đề với cookie không có thuộc tính DOMAIN không? IdCookie đi kèm với DXE2 không phân tích cú pháp các cookie KHÔNG có thuộc tính MAX-AGE, DO có thuộc tính EXPIRES và không có thuộc tính DOMAIN. Xem IdCookie.pas 675 cho nơi S có vẻ có giá trị không mong muốn (còn sót lại từ việc phân tích cú pháp thuộc tính hết hạn).