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

时间:2011-02-03 06:28:16

标签: java authentication httpurlconnection

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

所述
  

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

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

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

感谢。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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()));
    }

希望它有所帮助!