2014-09-17 1 views
1

Indy 구성 요소를 사용하는 Borland Delphi 7의 프로그램이 있는데 로그인과 비밀번호가 올바른지 확인하고 싶습니다.IdHTP를 통해 jsp 사이트와의 연결을 확인하는 방법

이 내 현재 코드입니다 : 내가 로그인 할 때

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 사이트와의 연결을 확인하는 적절한 방법은 무엇입니까?

+0

HTML 및 IdHTTP1.ResponseCode의 값은 무엇입니까? –

+0

HTML 값은 연결하려는 URL 주소입니다. IdHTTP1.ResposneCode의 값이 지정되지 않았습니다. programm는 ResponseCode가 401인지 확인해야합니다. 그렇다면 programm에 "잘못된 로그인 또는 암호"메시지가 표시되어야합니다. –

답변

3

특히 HTML 기반 로그인 양식이 포함 된 경우 ResponseCode에만 의존하여 로그인을 확인할 수 없습니다. 예, 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이 리디렉션 된 마지막 URL인지 확인할 수 있습니다.

BTW, 당신이 호출 Post()TStrings 버전은 그래서 당신은 JSON 형식의 데이터를 게시되지 않기 때문에 잘못이다 Request.ContentTypeapplication/json에 설정 application/x-www-form-urlencoded 게시물을 지원합니다. 다행히도 Post()ContentType을 올바른 값으로 바꿉니다. JSON 데이터를 게시하려면 버전을 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 

있다. 캡쳐 이미지 URL (페이지가 요청 될 때마다 d이 변경되는 https://e-skok.pl/eskok/captcha.jsp?d=1410970679796)을 추출하려면 HTML을 구문 분석하고 이미지를 다운로드 한 다음 (해당 앱에 TIdHTTP.Get()을 사용할 수 있음) 앱의 UI에 표시하면됩니다. 올바른 텍스트 값을 입력하여 j_captcha_response 필드에 게시하십시오.

시도해보고 결과를보고하십시오.

+0

TString에 대해 TStringList를 변경해야합니까? –

+0

아니요, 저는 코드에 버그를 지적하고있었습니다. HTML 기반 로그인 폼은 JSON을 사용하여 양식 필드 값을 전달하지 않습니다.'TStringList'는 서버가'application/x-www-form-urlencoded' 형식의 데이터를 제외하고는 괜찮습니다. (HTML'

'태그가 보통'multipart/form-data '). –

+0

그래서 Indy 구성 요소를 통해 jsp 사이트에 연결할 수 있습니까? 아니면 다른 기술/구성 요소로 변경해야합니까? –

관련 문제