簡體   English   中英

在POST重定向后,Indy使用GET發送params

[英]Indy sends params with GET after POST redirect

使用Delphi XE5 + Indy 10。

我發送登錄名和密碼POST以登錄。站點響應重定向(302)到目標頁面。 在瀏覽器中,重定向由GET處理,一切正常,但Indy繼續POST。

我通過在我的OnRedirect處理程序中使用此代碼來解決此問題:

procedure TForm1.MyRedirect(Sender: TObject;
                            var dest: string;
                            var NumRedirect: Integer;
                            var Handled: Boolean;
                            var VMethod: string);
var
  TempHttp: TIdHttp;
begin
  TempHttp := (Sender as TIdHTTP);

  if (TempHttp.ResponseCode = 302) then
    VMethod := 'GET';

  Handled := true;
end;

請求方法然后更改為GET,但Indy仍然使用GET發送POST請求參數。 所以我得到413請求實體太大的響應。

我怎樣才能讓Indy在重定向后不用GET發送params? OnRedirect內部的解決方案將是理想的。

謝謝!

處理HTTP 302回復代碼的客戶端行為是不明確的,並且經常被各種客戶端錯誤地處理。 這已在各種RFC中得到充分記錄,包括2068和2616. 303回復代碼是為了解決歧義而創建的,但許多客戶端仍然不支持303 ,並且許多服務器仍然使用302期望客戶端表現得好像使用了303

TIdHTTP多次來回試圖弄清楚在收到302時應該使用什么行為 - 它應該使用GET重定向,還是應該使用POST重定向? 2012年,在TIdHTTP.HTTPOptions屬性中添加了hoTreat302Like303標志,以便用戶決定該怎么做。 因此,請確保您使用的是最新版本的Indy。

如果收到303TIdHTTP將清除其Request.Source屬性(從而忽略任何以前的POST參數)並發送GET請求,忽略OnRedirect事件處理程序返回的方法(如果已分配)。

如果收到302

  1. 如果hoTreat302Like303啟用, TIdHTTP將清除它Request.Source財產(從而忽視了以往任何POST PARAMS),並發送一個GET請求,無視返回的方法OnRedirect事件處理程序,如果分配。

  2. 如果禁用了hoTreat302Like303 (默認情況下), TIdHTTP將使用OnRedirect事件處理程序返回的方法發送請求(如果已分配),否則它將使用與重定向的上一個請求相同的方法發送請求。 但在任何一種情況下,它都不會清除它的Request.Source屬性(因此將重新發送任何以前的POST參數)。 因此,如果您更改OnRedirect處理程序中的方法,則必須相應地更新Request.Source屬性,例如:

     procedure TForm1.MyRedirect(Sender: TObject; var dest: string; var NumRedirect: Integer; var Handled: Boolean; var VMethod: string); var TempHttp: TIdHttp; begin TempHttp := (Sender as TIdHTTP); if (TempHttp.ResponseCode = 302) then begin VMethod := 'GET'; TempHttp.Request.Source := nil; // <-- add this end; Handled := true; end; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM