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

2022-09-01 08:45:18

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

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

因此,我需要自己处理身份验证。我搜索了一遍,又搜索了一种使用已经编码的类的方法 - 但没有找到任何方法......

我可以从这里获取所需的源代码(因为它们是GPLv2,类路径例外)。这是正确的方法吗?

谢谢。


答案 1

是否需要输出流?最肯定的支持使用该类进行身份验证,请参阅:Http 身份验证HttpURLConnectionAuthenticator

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

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

答案 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()));
    }

希望它有帮助!


推荐