【问题标题】:How to handle HTTP authentication using HttpURLConnection?如何使用 HttpURLConnection 处理 HTTP 身份验证?
【发布时间】:2011-06-20 11:10:18
【问题描述】:

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

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

所以,我需要自己处理身份验证。我搜索并再次搜索,以寻找一种方法来使用已经编码的类 - 但找不到任何方法......

我可以从here 中提取所需的资源(因为它们是 GPLv2 与 Classpath 异常)。这是正确的方法吗?

谢谢。

【问题讨论】:

  • 什么样的身份验证? HTTP 基本身份验证?或者更复杂的东西?
  • 基本摘要协商。基本是简单。其他两个不是:)

标签: java authentication httpurlconnection


【解决方案1】:

您需要输出流式传输吗? 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();

【讨论】:

  • 是的。我的 POST 包含一个大小可能超过 2MB 的文件。
  • sun.misc.BASE64Encoder 依赖于 JVM。更好的选择可能是使用 Apache 的 org.apache.commons.codec.binary.Base64。
  • 与@Mat 的评论相关:在Android 上,你会想使用Base64.encodeToString() (code example)。
  • Https的流程是什么,这也可以吗?
  • 我有错误:java.lang.IllegalArgumentException异常:非法字符(多个)在消息头值:基本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) 为什么?
【解决方案2】:

与@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()));
    }

希望对你有帮助!

【讨论】:

猜你喜欢
  • 2014-08-05
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多