2014-09-17 1 views
1

У меня есть программа в Borland Delphi 7, которая использует компоненты Indy, и я хочу проверить правильность моего логина и пароля.Как проверить соединение с сайтом jsp через IdHTTP

Это мой текущий код:

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. 

Проблема заключается в том, когда я пытаюсь войти в систему, программа всегда говорит: «Да» (что означает, что он подключен, даже если Логин и/или пароль неверны) ,

Что такое правильный способ проверить соединение с сайтом jsp через IdHTTP?

+0

Какова ценность HTML и IdHTTP1.ResponseCode? –

+0

Значение HTML - адрес URL, который я хочу подключить. Значение IdHTTP1.ResposneCode не назначено - программа должна проверить, что ResponseCode равен 401 - если это так, тогда программа должна показать сообщение «Неверный логин или пароль» –

ответ

3

Вы не можете полагаться только на 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 перенаправлен.

Кстати, версия Post() вы звоните TStrings поддерживает только application/x-www-form-urlencoded сообщения, поэтому установив Request.ContentType в application/json является ошибочным, так как вы не проводки JSON отформатированных данных. К счастью, Post() заменяет ContentType на правильное значение. Если вы действительно хотите опубликовать данные JSON, вместо этого вы должны использовать TStream версию Post().

Обновление: после просмотра фактического HTML-кода от https://e-skok.pl/eskok/login.jsp, я вижу, что код, который вы изначально показали, неверен. Вы не правильно разбираете логин входа в систему (нет поля atlassian-token), и вы отправляете учетные данные на неправильный URL-адрес, используя неправильные имена полей. Вы должны опубликовать в https://e-skok.pl/eskok/j2_security_check вместо этого, и он ожидает следующие поля ввода:

j_username 
j_password 
j_captcha_response 

Это последнее поле, в частности, требует дополнительной работы, потому что это динамически CAPTCHA. Вам нужно будет проанализировать HTML-код, чтобы извлечь URL-адрес изображения captcha (https://e-skok.pl/eskok/captcha.jsp?d=1410970679796, где d изменяется при каждом запросе страницы), загрузите изображение (вы можете использовать для этого TIdHTTP.Get()) и отобразите его в пользовательском интерфейсе вашего приложения, чтобы вы могли введите правильное текстовое значение для сообщения в поле j_captcha_response.

Попробуйте это, а затем отчитайте результаты.

+0

Итак, я должен изменить TStringList для TStream? –

+0

Нет, я просто указывал на ошибку в коде. Никакая форма входа в систему на основе HTML никогда не будет использовать JSON для переноса значений поля формы.Использование 'TStringList' отлично до тех пор, пока сервер исключает форматированные данные' application/x-www-form-urlencoded' (по умолчанию, если тег HTML '

' не указывает другой формат, обычно 'multipart/form-data '). –

+0

Итак, можно ли подключиться к сайту jsp через компоненты Indy? Или я должен изменить его на другую технологию/компонент? –