Pregunta

Me estoy poniendo en práctica inicio de sesión único para el registro de funcionalidad en automágicamente a un sitio web afiliado HTTPS utilizando la autenticación implícita. Actualmente es mi código

URL url = new URL(protocol, ip, port, path);
URLConnection connection = url.openConnection(Proxy.NO_PROXY);
connection.connect();

if (connection != null && connection.getHeaderFields() != null) {
    if (connection.getHeaderFields().get(AUTHENTICATE_RESPONSE_HEADER) != null) {
        Map<String, String> authenticateParameters = identifyAuthentication(connection);

        String ha1 = calculateMD5(username + ":" + authenticateParameters.get("realm") + ":" + password);
        String ha2 = calculateMD5("GET" + ":" + path);
        String response = calculateMD5(ha1 + ":" + 
            authenticateParameters.get("nonce") + ":" +
            "00000001" + ":" +
            authenticateParameters.get("qop") + ":" +
            ha2);

            String authorizationRequest = authenticateParameters.get("challenge") + " " + 
                    "username=" + username + ", " +
                    "realm=" + authenticateParameters.get("realm") + ", " +
                    "nonce=" + authenticateParameters.get("nonce") + ", " +
                    "uri=" + path + ", " +
                    "qop=" + authenticateParameters.get("qop") + ", " +
                    "nc=" + "00000001" + ", " +
                    "response=" + response + ", " +
                    "opaque=" + authenticateParameters.get("opaque");

            connection.setAllowUserInteraction(true);
            connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest);
            connection.getHeaderFields();
    }
}

El problema es que tengo

java.lang.IllegalStateException: Already connected
    at java.net.URLConnection.addRequestProperty(URLConnection.java:1061)
    at sun.net.www.protocol.http.HttpURLConnection.addRequestProperty(HttpURLConnection.java:2016)
    at com.ibm.net.ssl.www2.protocol.https.a.addRequestProperty(a.java:49)

lo que, supongo, tiene sentido, pero no me ayuda. ¿Cómo hago para la creación de una petición / respuesta para el registro aquí (y eventualmente conseguir un sessionId)?

Gracias de antemano.

¿Fue útil?

Solución

No se puede modificar un encabezado de solicitud conexiones cuando ya ha sido conectado (ya ha enviado un encabezado de la solicitud). Usted tendrá que hacer una nueva conexión para la segunda solicitud.

por ejemplo.

connection = url.openConnection(Proxy.NO_PROXY);
connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest);
connection.getHeaderFields();

A continuación, puede obtener la sessionId o más bien la cookie de la cabecera.

Puede ser que sea más fácil utilizar el Apache de HttpClient capacidad Digesto: http: // hc.apache.org/httpclient-3.x/authentication.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top