Java 使用URLConnection的摘要身份验证

Java 使用URLConnection的摘要身份验证,java,urlconnection,digest-authentication,Java,Urlconnection,Digest Authentication,我正在实现单点登录功能,以便使用摘要身份验证自动登录到附属的https网站。目前我的代码是 URL url = new URL(protocol, ip, port, path); URLConnection connection = url.openConnection(Proxy.NO_PROXY); connection.connect(); if (connection != null && connection.getHeaderFields() != null) {

我正在实现单点登录功能,以便使用摘要身份验证自动登录到附属的https网站。目前我的代码是

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();
    }
}
我想这是有道理的,但对我没有帮助。我如何创建一个请求/响应来登录这里(并最终获得sessionId)


提前感谢。

如果已连接连接请求标头(您已发送请求标头),则无法修改该标头。您必须为第二个请求建立新连接

例如

然后,您可以从标题中获取sessionId,或者更确切地说是cookie


使用apache HttpClient的摘要功能可能更容易:

当连接请求头已经连接(您已经发送了请求头)时,您不能修改该连接请求头。您必须为第二个请求建立新连接

例如

然后,您可以从标题中获取sessionId,或者更确切地说是cookie


使用apache HttpClient的摘要功能可能更容易:

我们可以看到完整的stacktrace吗?我不确定您的方法中的哪一行失败。已添加-感谢您花费时间。我们可以查看完整的堆栈跟踪吗?我不确定您的方法中的哪一行失败。添加-感谢您花时间。建立新连接将返回与以前相同的401回复。但您没有收到原始异常,是吗?您的授权请求可能不正确。响应头是什么?最后我使用HttpClient实现了这一点。简单多了!很好,这对你有用!你为什么不愿意接受答案?建立一个新的连接会返回与以前相同的401回复。但是你不会得到原始的异常,是吗?您的授权请求可能不正确。响应头是什么?最后我使用HttpClient实现了这一点。简单多了!很好,这对你有用!你为什么不喜欢接受答案?
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)
connection = url.openConnection(Proxy.NO_PROXY);
connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest);
connection.getHeaderFields();