Delphi 如何通过IdHTTP检查与jsp站点的连接
我在Borland Delphi 7中有一个使用Indy组件的程序,我想检查我的登录名和密码是否正确 这是我当前的代码: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,
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,因此登录失败。