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

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());

ヘッダーを手動で作成するのではなく、認証データを先制的に送信するようにクライアントに指示する別の方法があればいいのですが、この方法で機能します。

于 2019-10-30T10:10:22.753 に答える