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.
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). –
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/ –
Ya estoy usando DefaultHttpClient. También tengo 'CookieHandler.setDefault (nuevo CookieManager (null, CookiePolicy.ACCEPT_ALL));' en la parte superior de mi código. – Dauntless