Упреждающая Стандартная аутентификация с Apache HttpClient 4

Существует ли более легкий способ установить http клиент для упреждающей стандартной аутентификации, чем, что описало здесь?
В предыдущей версии (3.x) это раньше было вызовом простого метода (например, httpClient.getParams().setAuthenticationPreemptive(true)).
Главное, которого я хочу избежать, добавляет BasicHttpContext к каждому методу, который я выполняю.

48
задан Jakub Šturc 6 November 2019 в 23:07
поделиться

2 ответа

Трудно сделать это, не передавая контекст каждый раз, но вы, вероятно, можете сделать это с помощью перехватчика запросов. Вот код, который мы используем (взят из их 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);
            }
        }

    }

}
23
ответ дан 7 November 2019 в 12:07
поделиться

Я не совсем понимаю твой заключительный комментарий. Это HttpClient имеет все машины для выполнения вытесняющей автозаписи, и вы должны сделать это только один раз (когда вы строите и настраиваете HttpClient). После того, как вы это сделали, вы строите экземпляры вашего метода так же, как и всегда. Вы не "добавляете BasicHttpContext" в метод.

Лучше всего, я думаю, иметь свой собственный объект, который настраивает весь мусор, требуемый для вытесняющего auth, и имеет простой метод или методы для выполнения запросов на заданных HTTPMethod объектах.

.
1
ответ дан 7 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: