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

Oph*_*her 33 java authentication httpurlconnection

我正在编写一个Java客户端,该客户端POST到需要身份验证的HTTP服务器.
我必须至少支持以下三种身份验证方法:Basic,Digest或Negotiate.此外,POST可能非常大(超过2MB),因此我需要使用流式传输.正如HttpURLConnection所记录的那样

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

所以,我需要自己处理身份验证.我搜索并再次搜索了一种使用已经编码的类的方法 - 但是没有办法......

我可以从这里获取所需的源(因为它们是带有Classpath异常的GPLv2).这是正确的方法吗?

谢谢.

Bru*_*ine 49

你需要输出流吗?在HttpURLConnection最肯定的支持与认证Authenticator类,请参阅:HTTP认证.

更新:如果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();
Run Code Online (Sandbox Code Playgroud)

  • 与@ Mat的评论相关:在Android上,你需要使用`Base64.encodeToString()`([code example](http://stackoverflow.com/a/7360440/56285)). (6认同)
  • sun.misc.BASE64Encoder依赖于JVM.更好的选择可能是使用Apache的org.apache.commons.codec.binary.Base64. (3认同)