【问题标题】:using indy for https with session/cookie将 indy 用于带有 session/cookie 的 https
【发布时间】:2014-08-21 07:09:07
【问题描述】:

我正在尝试使用 Indy 使用以下代码创建 HTTP 会话:

var
  idHttp1 : TidHttp;
  lIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  idCookie : TIdCookieManager;
  Initalized : boolean;

procedure InitSession;
begin
  Initalized := True;
  try
    idHttp1 := TIdHTTP.Create(nil); //the variables are declared globally
    lIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    idCookie := TIdCookieManager.Create(nil);

    idHttp1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0)';
    idHttp1.Request.Referer := 'https://www.parts.bmwgroup.com/';
    idHttp1.Request.AcceptLanguage := 'de';
    idHttp1.ConnectTimeout := 10000;
    idHttp1.ReadTimeout := 10000;
    idHttp1.Response.KeepAlive := true;
    idHttp1.IOHandler := lIOHandler;

    idHttp1.HandleRedirects := true;
    idHttp1.CookieManager := idCookie;
    idHttp1.AllowCookies := true;

    ShowMessage(IntToStr(idCookie.CookieCollection.Count));
  except
    Initalized := False;
  end;
end;

然后我这样做是为了创建用于登录网站的新会话 ID:

begin
  ...
  s := IdHTTP1.Get('https://www.parts.bmwgroup.com/tetis/index.jsp?DOMAIN=Internet');
end

当我从网站获得会话时,我尝试登录:

begin
  ...
  s := IdHTTP1.Get('https://www.parts.bmwgroup.com/tetis/startTetisAction.do?LOGON_USERID=XXXXXXXX&LOGON_PASSWD=XXXXXXXX');
end

现在,当我尝试使用实习生内容时,我收到如下 HTTP 消息:

<html>
<head>



<script language="JavaScript">
function zeigeLogin ()
{


        open ("/tetis/startTetisAction.do","TeTIS");

}
</script>
<title>Aftersales Assistance Portal ASAP</title>
<link rel="STYLESHEET" type="text/css" href="/tetis/css/content.css">
</head>

<body link="#003399" vlink="#666666" alink="#003399">
  <table border="0" cellspacing="0" cellpadding="0">
<tr>
    <td class="hl1">Aftersales Assistance Portal ASAP</td>
</tr>
<tr> 
    <td class="hl2">Ihre Session ist ungultig.<BR>Bitte melden Sie sich neu an.<BR>
    <BR>
    <a href="javascript:zeigeLogin()" class="h12red9">&gt; Login</a></td>
    </td>
</tr>
</table>
</body>
</html>

为什么我的会话不起作用?

【问题讨论】:

    标签: https delphi-xe2 session-cookies indy


    【解决方案1】:

    您没有正确登录。

    当您在网络浏览器中访问https://www.parts.bmwgroup.com/tetis/index.jsp?DOMAIN=Internet 时,它会显示一个弹出窗口,其中包含一个 HTML 登录表单。然后使用POST 请求将该登录表单提交到服务器,但您使用GET 请求发送登录凭据。

    当我尝试时,以下内容对我有用:

    var
      idHttp1 : TIdHTTP = nil;
      Initialized : Boolean = False;
    
    procedure InitSession;
    begin
      try
        idHttp1 := TIdHTTP.Create(nil);
        idHttp1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHttp1);
        idHttp1.CookieManager := TIdCookieManager.Create(IdHttp1);
    
        idHttp1.ConnectTimeout := 10000;
        idHttp1.ReadTimeout := 10000;
        idHttp1.HandleRedirects := true;
        idHttp1.AllowCookies := true;
    
        idHttp1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0)';
        idHttp1.Request.AcceptLanguage := 'de';
        idHttp1.Request.Connection := 'Keep-Alive';
    
        Initialized := True;
      except
        Initialized := False;
      end;
    end;
    

    begin
      ...
      idHttp1.Request.Referer := 'https://www.parts.bmwgroup.com/';
      s := IdHTTP1.Get('https://www.parts.bmwgroup.com/tetis/index.jsp?DOMAIN=Internet');
    end
    

    begin
      ...
      idHttp1.Request.Referer := 'https://www.parts.bmwgroup.com/tetis/index.jsp?DOMAIN=Internet';
      s := IdHTTP1.Get('https://www.parts.bmwgroup.com/tetis/startTetisAction.do?DOMAIN=Internet');
    end
    

    var
      PostParams: TStringList;
    begin
      ...
      PostParams := TStringList.Create;
      try
        PostParams.Add('LOGON_USERID=XXXXXXXX');
        PostParams.Add('LOGON_PASSWD=XXXXXXXX');
    
        IdHttp1.Request.Referer := 'https://www.parts.bmwgroup.com/tetis/startTetisAction.do?DOMAIN=Internet';
        s := IdHTTP1.Post('https://www.parts.bmwgroup.com/tetis/startTetisAction.do', PostParams);
      finally
        PostParams.Free;
      end;
    end
    

    【讨论】:

    • 我尝试执行您的代码,但它发送发布请求,当我使用 IE11 登录时,它只有获取请求。看这里:i.stack.imgur.com/bfSSk.jpgi.stack.imgur.com/JfIVA.jpg 在你的代码中你的意思是 IdHTTP1.POST,因为 IdHTTP1.Get 显示错误消息。
    • 您可以尝试使用用户名:eu444444 密码:minietk1 登录
    • 我在发布答案之前确实尝试过(使用不存在的凭据,因此我可以看到请求)。我之前说的是我看到 IE11 实际做的事情。访问会话 URL 会打开一个弹出窗口,其中包含使用 POST 而不是 GET 提交的登录表单。这就是我给你的代码。你试过我给你的代码了吗?您是否成功了,还是仍然出现错误?
    • 我也尝试发布请求,但它不起作用,我认为使用获取参数登录后我必须从网站启动一些功能......实际上我在登录后不能不使用某些东西发布或获取请求。我可以看到,在使用 webbrowser 登录后,他向服务器发送了许多 get 请求,在此请求之后,我可以将 evry 用于自己的请求,但只能在浏览器中使用......
    猜你喜欢
    • 2012-02-20
    • 2014-08-11
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2017-04-02
    • 2018-10-30
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多