如何使用HttpURLConnection处理HTTP身份验证?

33
我正在编写一个Java客户端,向需要身份验证的HTTP服务器发送POST请求。我必须至少支持以下三种身份验证方法:Basic、Digest或Negotiate。此外,POST请求可能非常大(超过2MB),因此我需要使用流传输。
根据HttpURLConnection文档的说明:

当启用输出流传输时,无法自动处理身份验证和重定向。如果需要身份验证或重定向,则在读取响应时会抛出HttpRetryException。

因此,我需要自己处理身份验证。我进行了搜索,再次搜索,想要找到一种利用已编码的类的方法,但没有找到适合我的方法...
我可以从这里提取所需的源代码(因为它们是具有Classpath例外的GPLv2)。这是正确的做法吗?
谢谢。

什么样的身份验证?HTTP基本认证?还是更复杂的东西? - Tim
要么是_Basic_,_Digest_或_Negotiate_。Basic很简单。另外两个就不是了 :) - Opher
2个回答

49

你需要输出流吗?HttpURLConnection绝对支持使用Authenticator类进行身份验证,请参见:Http Authentication

更新:如果Authenticator不是一个选项,您可以通过向HTTP请求添加额外的头来手动执行HTTP基本身份验证。尝试以下代码(未经测试):

String userPassword = username + ":" + password;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());
URLConnection uc = url.openConnection();
uc.setRequestProperty("Authorization", "Basic " + encoding);
uc.connect();

3
sun.misc.BASE64Encoder 是依赖于JVM的。更好的选择可能是使用来自Apache的org.apache.commons.codec.binary.Base64。 - Mat
这个工作得很好!谢谢。我也遇到了同样的问题。 - Gerard Cruz
6
与 @Mat 的评论相关:在 Android 上,您需要使用 Base64.encodeToString()代码示例)。 - Jonik
1
Https的过程是什么?这个也能行吗? - DevilCode
1
我遇到了错误: java.lang.IllegalArgumentException: message header value 中有非法字符:Basic YTFkOWY2ZjkzMzE2NDA2OTljYzA3ZjJkYzkyYTQ0Yjk6azF3bjFFelJ1RkdPeGdicnVtTk83b0Ft0pjVW1BV0ljVTFmK2pNbmpLcz0= 在sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:482)处 在sun.net.www.protocol.http.HttpURLConnection.isExternalMessageHeaderAllowed(HttpURLConnection.java:434)处 在sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:2753)处为什么会出现这种情况? - Koss
显示剩余2条评论

4

与@Mat的评论相关:

这是我的团队和我使用的一个示例:

import org.apache.commons.codec.binary.Base64;

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }

希望能对您有所帮助!

我的Eclipse没有找到编解码包,但是你可以直接从http://commons.apache.org/proper/commons-codec/download_codec.cgi下载并将jar文件添加为引用! - Tyron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接