2012-03-01 26 views
5

Estoy intentando crear una aplicación de inicio de sesión para una red de campus. He llegado bastante lejos, pero ahora estoy atascado.Envío de un formulario html con java

estoy en un punto en java me devuelve una página que contiene un formulario simple que debe presentar automático:

<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> 

Cuando copio esta cadena a un archivo .html y hacer click en enviar, registra yo estoy bien. Ahora estoy tratando de hacer esto en Java, por lo que extraer RelayState y SAMLResponse y pega el siguiente código a presentar:

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(); 

Este código devuelve un 500 - error interno del servidor. ¿Qué me estoy perdiendo?

Para probar lo que estaba siendo enviado, he cambiado la ruta de un sencillo print_r ($ _ POST) y print_r (getallheaders()) y esto es lo que tengo:

//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 
) 

noto que el contenido- El encabezado de longitud no es el mismo para los dos casos, pero no sé por qué es eso o si tiene algo que ver con eso.

+0

Intente obtener más detalles para este error 500. Compruebe las cookies. Tal vez deberías tener un id de sesión en algún lugar. String.getBytes() usa el conjunto de chasis predeterminado de la plataforma para convertir chars en bytes. Intente especificar el juego de caracteres (por ejemplo, ISO-8859-2). –

+1

No necesariamente relacionado con su problema, pero utilizo la clase HttpClient de Apache Commons para hacer este tipo de trabajo - http://hc.apache.org/httpclient-3.x/ –

+0

Ya estoy usando DefaultHttpClient. También tengo 'CookieHandler.setDefault (nuevo CookieManager (null, CookiePolicy.ACCEPT_ALL));' en la parte superior de mi código. – Dauntless

Respuesta

2

Si tiene acceso a los registros del servidor, puede ayudar. El estado 500 se produce cuando ocurre un error interno del servidor. Significa que está haciendo algo que el servidor no puede manejar con éxito.

Si no tiene acceso al servidor, intente lo siguiente. Primero, compruebe nuevamente que su solicitud enviada desde Java es (casi) idéntica a la enviada desde el navegador. Puedes usar WireShark para esto.

Si crees que todo está bien pero aún no funciona, es posible que seas apátrida. Cuando el navegador llega al sitio la primera vez, recibe el ID de la sesión de regreso enviado como una cookie especial. Las cookies se envían en el encabezado de respuesta llamado Set-Cookie. El navegador toma el contenido de este encabezado y lo envía de vuelta como encabezado de solicitud 'Cookie'. Esta es la diferencia entre su aplicación y su navegador.

Teóricamente, el servidor no debe fallar en esta solicitud. Simplemente debería redirigirlo de nuevo a la página de inicio de sesión. Pero parece que hay un error en el lado del servidor: simplemente no puede manejar su solicitud "incorrecta" y arroja una excepción.

BTW si quiere hacer las cosas más fáciles para el usuario HttpClient de jakarta.apache.org. Es compatible con el modo de sesión completa, por lo que no tiene que lidiar con detalles sangrientos del protocolo HTTP. Pero también puedes mantenerte con HttpConnection si lo deseas. \

Buena suerte.

+0

+1 por sugerir Wireshark. ¡Tan práctico, se siente como hacer trampa! – TMN

+0

Olvidé mencionar que la URL real es https, así que apuesto a que no puedo usar WireShark. (No tengo el servidor) Además, primero ejecuto un programa de Java y termina con esta cadena html-form. Luego copio eso en un archivo temp.html y lo abro en mi navegador. Cuando hago clic en 'enviar', me registra.Como mi navegador y JRE no comparten cookies, no creo que sea un problema de estado/cookie (corríjame si estoy equivocado) Como dije en mi otro comentario, estoy usando DefaultHttpClient de apache. ¿Es eso diferente al que estás sugiriendo? – Dauntless

Cuestiones relacionadas