如何使用 Java 11 HTTP 客户端进行抢先式身份验证?
How to do Preemptive authentication using Java 11 HTTP client?
我正在尝试使用 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());
我期望的是我可以告诉客户端抢先发送身份验证数据,而不仅仅是在服务器请求时。
HttpClient
的行为方式与 HttpURLConnection
在抢先身份验证方面的行为相同:对于基本身份验证,如果在其缓存中找到凭据,它将抢先发送凭据。但是,缓存在第一次成功请求后填充(或更确切地说,在指示身份验证成功的响应 header 被解析后)。
如果这对您来说不满意,那么可以通过在您的请求中预先插入 Authorization
header 而不设置任何 Authenticator
来直接在您的代码中处理身份验证.
感谢@daniel,这是我提出的解决方案,将 header 添加到 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,但这种方式可行。
我正在尝试使用 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());
我期望的是我可以告诉客户端抢先发送身份验证数据,而不仅仅是在服务器请求时。
HttpClient
的行为方式与 HttpURLConnection
在抢先身份验证方面的行为相同:对于基本身份验证,如果在其缓存中找到凭据,它将抢先发送凭据。但是,缓存在第一次成功请求后填充(或更确切地说,在指示身份验证成功的响应 header 被解析后)。
如果这对您来说不满意,那么可以通过在您的请求中预先插入 Authorization
header 而不设置任何 Authenticator
来直接在您的代码中处理身份验证.
感谢@daniel,这是我提出的解决方案,将 header 添加到 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,但这种方式可行。