繁体   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