Существует ли более легкий способ установить http клиент для упреждающей стандартной аутентификации, чем, что описало здесь?
В предыдущей версии (3.x) это раньше было вызовом простого метода (например, httpClient.getParams().setAuthenticationPreemptive(true)
).
Главное, которого я хочу избежать, добавляет BasicHttpContext к каждому методу, который я выполняю.
Трудно сделать это, не передавая контекст каждый раз, но вы, вероятно, можете сделать это с помощью перехватчика запросов. Вот код, который мы используем (взят из их JIRA, iirc):
// Pre-emptive authentication to speed things up
BasicHttpContext localContext = new BasicHttpContext();
BasicScheme basicAuth = new BasicScheme();
localContext.setAttribute("preemptive-auth", basicAuth);
httpClient.addRequestInterceptor(new PreemptiveAuthInterceptor(), 0);
(...)
static class PreemptiveAuthInterceptor implements HttpRequestInterceptor {
public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException {
AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
// If no auth scheme avaialble yet, try to initialize it
// preemptively
if (authState.getAuthScheme() == null) {
AuthScheme authScheme = (AuthScheme) context.getAttribute("preemptive-auth");
CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);
HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
if (authScheme != null) {
Credentials creds = credsProvider.getCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort()));
if (creds == null) {
throw new HttpException("No credentials for preemptive authentication");
}
authState.setAuthScheme(authScheme);
authState.setCredentials(creds);
}
}
}
}
Я не совсем понимаю твой заключительный комментарий. Это HttpClient имеет все машины для выполнения вытесняющей автозаписи, и вы должны сделать это только один раз (когда вы строите и настраиваете HttpClient). После того, как вы это сделали, вы строите экземпляры вашего метода так же, как и всегда. Вы не "добавляете BasicHttpContext" в метод.
Лучше всего, я думаю, иметь свой собственный объект, который настраивает весь мусор, требуемый для вытесняющего auth, и имеет простой метод или методы для выполнения запросов на заданных HTTPMethod объектах.
.