2

我正在尝试使用基本身份验证对经过身份验证的服务使用 Java 11 HTTP 客户端。身份验证成功发生,但它对服务器进行了额外的往返,以了解它应该发送身份验证数据。

已经搜索了文档和代码,并且在内部的某个时候它使用了某种缓存,但我无法设置缓存值。

这是我的客户代码:

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://someurl.com"))
        .build();

HttpClient client = HttpClient.newBuilder()
        .authenticator(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("user", "pass".toCharArray());
            }
        })
        .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

我所期望的是,我可以以某种方式告诉客户端抢先发送身份验证数据,而不仅仅是在服务器请求时。

4

2 回答 2

3

HttpClient行为方式与HttpURLConnection所关注的抢先式身份验证相同:对于基本身份验证,如果在缓存中找到凭据,它将抢先发送凭据。但是,缓存是在第一个成功请求之后填充的(或者更确切地说,是在解析表明身份验证成功的响应标头之后)。

如果这对您不满意,那么可以通过Authorization在您的请求中预先插入标头而不设置任何Authenticator.

于 2019-10-29T17:25:43.037 回答
0

感谢@daniel,这是我提出的解决方案,将标头添加到 HttpRequest 并删除 Authenticator。

String encodedAuth = Base64.getEncoder()
        .encodeToString(("user" + ":" + "pass").getBytes(StandardCharsets.UTF_8));

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://someurl.com"))
        .header("Authorization", "Basic " + encodedAuth)
        .build();

HttpClient client = HttpClient.newHttpClient();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

希望客户端有其他方法可以告诉抢先发送身份验证数据,而不是手动创建 Header,但这种方式可以工作。

于 2019-10-30T10:10:22.753 回答