Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何通过IdHTTP检查与jsp站点的连接_Delphi_Indy_Indy10 - Fatal编程技术网

Delphi 如何通过IdHTTP检查与jsp站点的连接

Delphi 如何通过IdHTTP检查与jsp站点的连接,delphi,indy,indy10,Delphi,Indy,Indy10,我在Borland Delphi 7中有一个使用Indy组件的程序,我想检查我的登录名和密码是否正确 这是我当前的代码: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,

我在Borland Delphi 7中有一个使用Indy组件的程序,我想检查我的登录名和密码是否正确

这是我当前的代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdSSL, IdSSLOpenSSL, IdCookieManager, StrUtils;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Memo1: TMemo;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    IdCookieManager1: TIdCookieManager;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 post: TStringList;
 poczatek, koniec: integer;
 aStream: TMemoryStream;
 HTML, authToken: string;
 fLogin, fHaslo: string;
begin
 IdHTTP1.HandleRedirects := True;

 fLogin := Edit1.Text;
 fHaslo := Edit2.Text;

 HTML := IdHTTP1.Get('https://e-skok.pl/eskok/login.jsp');
 poczatek := Pos('name="atlassian-token" value="', HTML) +
 Length('name="atl_token" value="');
 koniec := PosEx('"', HTML, poczatek);
 authToken := copy(HTML, poczatek, koniec - poczatek);

 post := TStringList.Create;
 try
   post.Add('atlassian-token=' + authToken);
   post.Add('os_username=' + fLogin);
   post.Add('os_password=' + fHaslo);
 try
   IdHTTP1.Request.ContentType:= 'application/json';
   HTML:= IdHTTP1.Post('https://e-skok.pl/eskok/login.jsp', post);
   Memo1.Text:= HTML;
   Label1.Caption := 'YES';
 except
     if IdHTTP1.ResponseCode = 401 then
       begin
       ShowMessage('Nieprawidłowy login lub hasło.');
       Label1.Caption := 'NO';
       end
      else
      Label1.Caption := ':)';
 end;
 finally
   post.Free;
 end;
end;
end.
问题是当我尝试登录时,程序总是说“是”(这意味着它已连接,即使登录和/或密码错误)


通过IdHTTP检查与jsp站点的连接的正确方法是什么?

您不能仅依靠
响应代码来验证您的登录,尤其是当涉及基于HTML的登录表单时。是,
Post()
在返回HTTP错误代码时引发异常。因此,
Post()
没有引发异常这一事实意味着服务器没有报告HTTP错误。但是它返回的内容可能是HTML错误页面,甚至是显示失败消息的登录页面(这并不少见)。因此,当
Post()
“成功”时,您需要分析响应以确保它是您所期望的

当我转到
https://e-skok.pl/eskok/login.jsp
在web浏览器中输入错误凭据时,我会被重定向回
https://e-skok.pl/eskok/login.jsp?err=1
。当
Post()
无异常退出时,您可以检查
TIdHTTP.Response
以查看这是否是重定向到的最后一个URL

顺便说一句,您正在调用的
TStrings
版本的
Post()
只支持
application/x-www-form-urlencoded
posts,因此将
请求.ContentType
设置为
application/json
是错误的,因为您没有发布json格式的数据。幸运的是,
Post()
ContentType
替换为正确的值。如果您确实想发布JSON数据,则必须使用
TStream
版本的
post()

更新:查看
https://e-skok.pl/eskok/login.jsp
,我可以看出您最初显示的代码不正确。您没有正确解析登录HTML(不存在
atlassian令牌
字段),并且使用错误的字段名将凭据发布到错误的URL。您必须发布到
https://e-skok.pl/eskok/j2_security_check
相反,它需要以下输入字段:

j_username
j_password
j_captcha_response
最后一个字段尤其需要额外的工作,因为它是动态生成的验证码。您必须解析HTML以提取验证码图像的URL(
https://e-skok.pl/eskok/captcha.jsp?d=1410970679796
,其中
d
每次请求页面时都会更改),下载图像(您可以使用
TIdHTTP.Get()
)并将其显示在应用程序的UI中,这样您就可以在
j_captcha_response
字段中输入正确的文本值


试试看,然后报告结果。

HTML和IdHTTP1.ResponseCode的值是多少?HTML的值是我要连接的url地址。未分配IdHTTP1.ResposneCode的值-程序应检查ResponseCode是否为401-如果为401,则程序应显示消息“登录或密码错误”,因此,我应为TStream更改TStringList?不,我只是指出代码中的一个错误。任何基于HTML的登录表单都不会使用JSON来携带表单字段值。只要服务器不使用
应用程序/x-www-form-urlencoded
格式的数据(这是默认值,除非HTML
标记指定另一种格式,通常是
多部分/表单数据
),就可以使用
TStringList
。那么,是否可以通过Indy组件与jsp站点连接?或者我应该把它换成另一种技术/组件吗?我也试着在登录后从站点检查一个指定的代码,但它仍然不能正常工作。@adam.cziker:当然有可能,我告诉过你怎么做。你只是还没有正确处理它。例如,当我运行您显示的代码时,
authToken
没有得到正确的值,因为
Pos('name=“atlassian-token”value=“”,HTML)
返回0。因此,在调用
Post()
之前,您没有正确解析登录HTML,因此登录失败。