Basic authentication 如何使用Java11HTTP客户端进行抢占式身份验证?

Basic authentication 如何使用Java11HTTP客户端进行抢占式身份验证?,basic-authentication,java-11,java-http-client,Basic Authentication,Java 11,Java Http Client,我正在尝试使用基本身份验证对经过身份验证的服务使用Java11HTTP客户端。 身份验证成功进行,但它向服务器进行了额外的往返,以了解它应该发送身份验证数据 我已经搜索了文档和代码,在内部某个地方它使用了某种缓存,但我无法设置缓存值 这是我的客户代码: HttpRequest请求=HttpRequest.newBuilder() .uri(uri.create(“http://someurl.com")) .build(); HttpClient=HttpClient.newBuilder()

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

我已经搜索了文档和代码,在内部某个地方它使用了某种缓存,但我无法设置缓存值

这是我的客户代码:

HttpRequest请求=HttpRequest.newBuilder()
.uri(uri.create(“http://someurl.com"))
.build();
HttpClient=HttpClient.newBuilder()
.authenticator(新的authenticator(){
@凌驾
受保护的密码身份验证getPasswordAuthentication(){
返回新的密码身份验证(“user”,“pass”.tocharray());
}
})
.build();
HttpResponse response=client.send(请求,HttpResponse.BodyHandlers.ofString());

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

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


如果您对此不满意,那么可以通过在请求中预先插入
授权
头,直接在代码中处理身份验证,并且不设置任何
身份验证程序
,多亏了@daniel,这是我提出的解决方案,将标头添加到HttpRequest并删除验证器

String encodedAuth=Base64.getEncoder()
.encodeToString((“用户”+:“+”传递”).getBytes(StandardCharsets.UTF_8);
HttpRequest请求=HttpRequest.newBuilder()
.uri(uri.create(“http://someurl.com"))
.header(“授权”、“基本”+encodedAuth)
.build();
HttpClient=HttpClient.newHttpClient();
HttpResponse response=client.send(请求,HttpResponse.BodyHandlers.ofString());
希望客户机有其他方法告诉您以抢先方式发送身份验证数据,而不是手动创建标头,但这种方法是有效的