[英]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。
如果收到303
, TIdHTTP
將清除其Request.Source
屬性(從而忽略任何以前的POST
參數)並發送GET
請求,忽略OnRedirect
事件處理程序返回的方法(如果已分配)。
如果收到302
:
如果hoTreat302Like303
啟用, TIdHTTP
將清除它Request.Source
財產(從而忽視了以往任何POST
PARAMS),並發送一個GET
請求,無視返回的方法OnRedirect
事件處理程序,如果分配。
如果禁用了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.