Java \ Groovy - java.io.IOException: ошибка аутентификации в простом аутентифицированном HTTP-запросе - PullRequest
0 голосов
/ 04 мая 2018

Я использую Groovy \ Java. Я пытаюсь загрузить файл с сервера с помощью простого HTTP GET. Этот код работает на каждом компьютере, который мы пробовали, за исключением компьютера моего коллеги.

new File(fullFilePath).withOutputStream { out ->

            url = new URL(COMPLETE_URL).openConnection() 

            Authenticator.setDefault (new Authenticator() {
                            protected PasswordAuthentication getPasswordAuthentication() {
                                return new PasswordAuthentication (USER, PASSWORD);
                            }
                        });

                out << url.inputStream
            }

Странно то, что этот код отлично работает на моем компьютере и на экземпляре AWS в Windows 10 и Windows Server 2012, и он НЕ работает на компьютере моего коллеги, в Windows 10. Все 64-битные.

У всех нас одинаковая версия Java. Антивирус и брандмауэр отключены. Я пытался с его учетными данными, а он с моими, он все еще работает не только с его компьютера.

Ошибка:

java.io.IOException: Authentication failure
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1695)
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
...

Что еще мы можем попробовать и проверить?

1 Ответ

0 голосов
/ 05 мая 2018

Использование Authenticator.setDefault() - плохой подход к этому. Это приведет к тому, что Java отправит ваше имя пользователя и пароль на ЛЮБОЙ запрос, который JVM делает, который запрашивает учетные данные.

Трудно сказать, почему это происходит только на одной машине, но, вероятно, конфигурация Java должна быть другой.

В любом случае, попробуйте изменить свой код, чтобы просто установить заголовок аутентификации для каждого запроса. Это сделает ваш код менее зависимым от внутренних компонентов Java и не будет просто отправлять ваши учетные данные при каждом запросе, который JVM может сделать в будущем:

def authHeaderValue = 'Basic ' + Base64.encoder.encodeToString("$USER:$PASSWORD".bytes)

new File(fullFilePath).withOutputStream { out ->
    connection = new URL(COMPLETE_URL).openConnection()
    connection.setRequestProperty('Authorization', authHeaderValue)
    out << connection.inputStream
}

Я написал сообщение в блоге о выполнении HTTP-запросов в Groovy без библиотек, возможно, вы захотите проверить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...