2012-03-01 5 views
5

캠퍼스 네트워크 용 로그인 앱을 만들려고합니다. 나는 꽤 멀리 받았지만 지금은 붙어있다.자바와 함께 html 양식 제출

나는 자바 나에게 자동으로 제출해야합니다 간단한 양식을 포함하는 페이지를 반환 한 점에 있어요 :이 문자열을 복사 할 때 .html 파일에

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<body onload="document.forms[0].submit()">  
<noscript>  
    <p>  
     <strong>Note:</strong> Since your browser does not support JavaScript,    you must press the Continue button once to proceed.    
    </p>   
</noscript>     

<form action="url" method="post"> 
    <div> 
     <input type="hidden" name="RelayState" value="ss:mem:43141e4108638211a81427d145c7e9de"/>   

     <input type="hidden" name="SAMLResponse" value="base64string"/>   
    </div>  
    <noscript>   
     <div>  
      <input type="submit" value="Continue"/>  
     </div>  
    </noscript>  
</form>  
</body></html> 

를 제출 클릭, 그것은 기록 나 괜찮아. 지금은 자바에서이 작업을 수행하기 위해 노력하고있어, 그래서 나는 RelayState 값과 SAMLResponse를 추출하여 제출하려면 다음 코드를 사용

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

String params = "RelayState="+relayState+"&SAMLResponse="+saml; 
System.out.println(params.length()); 

urlConnection.setRequestMethod("POST"); 
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
urlConnection.setRequestProperty("Content-Length", Integer.toString(params.getBytes().length)); 
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20100101 Firefox/10.0.2"); 


urlConnection.setDoInput(true); 
urlConnection.setDoOutput(true); 

DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream()); 
wr.writeBytes(params); 
wr.flush(); 
wr.close(); 

InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 

DataInputStream dis = new DataInputStream(new BufferedInputStream(in)); 

String fullPage = ""; 
String s; 
while ((s = dis.readLine()) != null) 
{ 
    fullPage += s; 
} 

urlConnection.disconnect(); 

이 코드는 500 반환 - 내부 서버 오류가 발생했습니다. 내가 뭘 놓치고 있니?

전송되고 있었는지 테스트하려면, 내가 간단한에서 print_r에 URL을 변경 ($는 POST _)이 내가 가진 무엇 인 print_r (getAllHeaders())이며 :

//when I submit using java: 
Array( 
    [Accept] => text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2  
    [Connection] => keep-alive  
    [Content-Length] => 14176  
    [Content-Type] => application/x-www-form-urlencoded  
    [Host] => xxx 
    [User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 
) 

Array( 
    [RelayState] => ss:mem:43141e4108638211a81427d145c7e9de 
    [SAMLResponse] => base64string 
) 



//when I submit by copying the string to my browser and clicking submit 
Array 
(
    [Accept] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    [Accept-Encoding] => gzip, deflate 
    [Accept-Language] => en-us,en;q=0.5 
    [Connection] => keep-alive 
    [Content-Length] => 14204 
    [Content-Type] => application/x-www-form-urlencoded 
    [DNT] => 1 
    [Host] => xxx 
    [User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 
) 
Array 
(
    [RelayState] => ss:mem:43141e4108638211a81427d145c7e9de 
    [SAMLResponse] => base64string 
) 

내가 컨텐츠 -는 것을 알 수 길이 헤더는 두 경우에서 동일하지 않지만 왜 그런지 또는 그 헤더와 관련이 있는지 알 수 없습니다.

+0

이 오류 500에 대한 자세한 정보를보십시오. 쿠키를 확인하십시오. 세션 ID somwhere가 있어야 할 것입니다. String.getBytes()는 플랫폼 defaultcharset을 사용하여 문자를 바이트로 변환합니다. 문자 세트 (예 : ISO-8859-2)를 지정하십시오. –

+1

반드시 문제와 관련이있는 것은 아니지만 Apache Commons의 HttpClient 클래스를 사용하면이 작업을 수행 할 수 있습니다. - http : //hc.apache.org/httpclient-3.x/ –

+0

저는 이미 DefaultHttpClient를 사용하고 있습니다. 나는 또한 내 코드 상단에'CookieHandler.setDefault (new CookieManager (null, CookiePolicy.ACCEPT_ALL));를 가지고있다. – Dauntless

답변

2

서버 로그에 액세스하면 도움이 될 수 있습니다. 내부 서버 오류가 발생하면 상태 500이 발생합니다. 즉, 서버에서 성공적으로 처리 할 수없는 을 수행하고 있음을 의미합니다.

서버에 액세스 할 수없는 경우 다음을 시도하십시오. 먼저 자바에서 전송 된 요청이 브라우저에서 전송 된 요청과 거의 동일한 지 다시 확인하십시오. 이를 위해 WireShark를 사용할 수 있습니다.

모든 것이 정상이지만 여전히 작동하지 않는다고 생각하는 경우 귀하는 무국적자입니다. 브라우저가 사이트에 처음 도착하면 특수 쿠키로 보낸 세션 ID를 다시받습니다. 쿠키는 Set-Cookie이라는 응답 헤더로 보내집니다. 브라우저는이 헤더의 내용을 가져 와서 요청 헤더 '쿠키'로 다시 보냅니다. 이것은 응용 프로그램과 브라우저의 차이점입니다.

이론적으로 서버가이 요청에 실패하지 않아야합니다. 다시 로그인 페이지로 리디렉션하면됩니다. 그러나 그것은 서버 측에 버그가있는 것처럼 보입니다. "잘못된"요청을 처리하지 못하고 예외를 throw합니다.

BTW를 사용하면 쉽게 사용자 HttpClient를 jakarta.apache.org에서 만들고 싶습니다. 세션 풀 모드를 지원하므로 HTTP 프로토콜의 세부적인 사항을 다룰 필요가 없습니다. 그러나 원하는 경우 일반 HttpConnection도 사용할 수 있습니다. \

행운을 빈다.

+0

+1 Wireshark를 제안합니다. 이렇게 경편 한 느낌, 그것은 속임수 같이 느낀다! – TMN

+0

실제 URL이 https임을 언급하는 것을 잊어 버렸으므로 WireShark를 실제로 사용할 수 없다는 것을 알고 있습니다. (저는 서버를 소유하지 않습니다.) 또한 자바 프로그램을 먼저 실행하고이 html 형식 문자열로 끝납니다. 그런 다음 temp.html 파일에 복사하고 브라우저에서 엽니 다. '제출'을 클릭하면 나를 기록합니다.내 브라우저와 JRE가 쿠키를 공유하지 않기 때문에 상태/쿠키 문제라고 생각하지 않습니다. (틀렸다면 수정하십시오) 다른 의견에서 말씀 드렸듯이 저는 Apache에서 DefaultHttpClient를 사용하고 있습니다. 당신이 제안하는 것과는 다른 것입니까? – Dauntless