gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:40:56 25 4
gpt4 key购买 nike

我在 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.

问题是当我尝试登录时,程序总是说"is"(这意味着它已连接,即使登录名和/或密码错误)。

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

最佳答案

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

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

顺便说一句,TStrings Post() 的版本你打电话只支持application/x-www-form-urlencoded帖子,所以设置 Request.ContentTypeapplication/json是错误的,因为您没有发布 JSON 格式的数据。幸运的是,Post()替换 ContentType具有正确的值。如果你真的想发布 JSON 数据,你必须使用 TStream Post() 的版本反而。

更新 : 在查看了 https://e-skok.pl/eskok/login.jsp 中的实际 HTML 之后,我可以看到您最初显示的代码不正确。您没有正确解析登录 HTML(不存在 atlassian-token 字段),并且您使用错误的字段名称将凭据发布到错误的 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 中发布 field 。

试试看,然后报告你的结果。

关于delphi - 如何通过 IdHTTP 检查与 jsp 站点的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25883498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com