2010-11-21 3 views
1

Apache HttpComponents Client를 사용하여 웹 사이트의 로그인 프로세스를 Java에서 시뮬레이트하려고합니다. 지금은 실패하고 있으며 이유는 확실하지 않습니다. Firebug를 파이어 폭스에서 사용하여 동일한 브라우저 이벤트를 시도하고 있으며 폼의 특정 POST 메소드로 로그인하고 있다고 확신합니다.잘못된 HTTP 로그인 문제를 어떻게 해결해야합니까?

여기 내 코드가 있습니다. 마지막에는 많은 쿠키가 설정되기를 기대하지만 그렇지 않습니다. 이후 GET 요청에 대한 응답은 로그인에 실패했음을 증명합니다.

String email = ... 
String password = ... 
String url = ... 
DefaultHttpClient client = new DefaultHttpClient(); 
List<NameValuePair> loginParams = new ArrayList<NameValuePair>(2); 
loginParams.add(new BasicNameValuePair("logindetails[email]", email)); 
loginParams.add(new BasicNameValuePair("logindetails[password]", password)); 
UrlEncodedFormEntity loginEntity = new UrlEncodedFormEntity(loginParams); 
HttpPost loginPost = new HttpPost(url); 
loginPost.setEntity(loginEntity); 
HttpResponse loginResponse = client.execute(loginPost); 
HttpEntity loginRepsonseEntity = loginResponse.getEntity(); 
loginRepsonseEntity.consumeContent(); 

for (Cookie cookie: client.getCookieStore().getCookies()) { 
    System.out.println(cookie.getName() + " -> " + cookie.getValue()); 
} 

어디서 문제가 발생합니까? 나는 POST가 나의 브라우저가 만들고있는 것과 똑같은지 확인하고 싶다 - 그렇게하는 가장 좋은 방법은 무엇인가?

답변

2

우리는 매일 아파치 HttpClient를 사용합니다. 훌륭합니다. 자신이 데이터를 인코딩하는 곳에서하는 일은 나에게 조금 이상합니다. 더 쉬운 방법이 있습니다. POST를하고 있다고 가정합니다.

String email = ... 
String password = ... 
String url = ... 

PostMethod post = new PostMethod(url); 

NameValuePair[] data = { 
    new NameValuePair("logindetails[email]", email), 
    new NameValuePair("logindetails[password]", password) 
}; 

post.setRequestBody(data); 

// execute method and handle any error responses. 

HttpClient httpclient = new HttpClient(); 

int statusCode = httpclient.executeMethod(post); 

// continue as neccessary 

는 그 코드를했다 (더 나은 당신을 맞도록 수정) 아파치 HttpClient를 사이트에서. 좋은 이유가없는 한 UrlEncodedFormEntity를 사용하여 필드를 직접 패키징 할 필요가 없습니다.

이런 종류의 디버깅에 대해서는 WireShark을 사용하여 패킷을 앞뒤로 이동하는 것을 보는 것이 가장 쉽습니다. HTTPS를 사용하지 않는 한이 요청을 통해 브라우저가 보내는 내용과 비교하여 잘못 전송 된 내용을 쉽게 알 수 있습니다. 그것은 세계에서 가장 친숙한 프로그램이 아니지만, 이런 종류의 것을 알아 내려고 할 때 매우 중요합니다.

1

파이어 폭스에서 파이어 버그를 사용하여 웹 페이지를 사용할 때 게시가 어떻게 수행되는지 조사하기 위해 넷 탭을 살펴볼 수 있습니다. 귀하의 코드를 보면, 내 추측은 매개 변수 이름이 이상하다는 것입니다. logindetails[email]logindetails[password] 이상하게 보입니다.

이 갖는 동등한 것 :

<form action="...url" method="post"> 
    email: <input type="text" name="logindetails[email]"/><br/> 
    password: <input type="password" name="logindetails[password]"/><br/> 
    <input type="submit" value="submit"/> 
</form> 

그 의도 무엇을해야합니다 ... 멋진 컬 유틸리티에서

+0

그렇습니다. 그 입력은 정말로 그 이상한 이름을 가지고 있습니다 ... – HenryTyler2

+0

다음, 다음 번에는 인터넷 탭을 점검하기 위해 방화 상자를 사용하는 것이 좋습니다. 그런 다음 HttpClient에서 디버깅을 켜고 게시물의 내용을 비교하십시오. –

+0

그 이상한 arent. PHP는 이러한 태그를 지원하고이를 배열로 해석합니다. – ZeissS

0

봐 ->http://curl.haxx.se/docs/manpage.html.

유닉스/리눅스에서는 유비쿼터스이며 Windows의 Cygwin에서 사용할 수 있습니다.

명령 줄에서 몇 번의 키 입력으로 Java에서 수행하려는 작업을 수행 할 수 있습니다.

관련 문제