Java: чтение удаленного XML, для которого требуется вход в систему

#java #spring-boot #remote-access #jcifs

#java #весенняя загрузка #удаленный доступ #jcifs

Вопрос:

У меня есть приложение Spring Boot, которое требует чтения XML-файла, доступного онлайн (через https), но требует входа в систему (он генерируется RedMine API, если это поможет). У меня есть учетная запись с именем пользователя и паролем, проверенная и работающая (можно войти через браузер), и я пытаюсь использовать JCIFS, как показано ниже, но я получаю ошибку «время ожидания соединения» (файл XML определенно доступен в данный момент). Что я делаю не так?

 NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, USERNAME, PASSWORD);  
      
try (InputStream is = new SmbFile("https://mypath/issues.xml?limit=100", auth).getInputStream()) {
            System.out.println(is.toString());
        } catch (IOException e) {
            // Handle IOException
        }
  

Ответ №1:

Вы можете выполнить это без каких-либо сторонних библиотек, см. Это сообщение в блоге:

https://www.baeldung.com/java-http-url-connection

и короткий пример:

 import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AuthenticationTest {

    public static void main(String[] args) throws IOException {
        String url = "https://mypath/issues.xml?limit=100";
        String user = "user";
        String password = "pass";

        String auth = user   ":"   password;
        byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8));
        String authHeaderValue = "Basic "   new String(encodedAuth);

        char[] buffer = new char[1024];
        int len = -1;

        URLConnection connection = new URL(url).openConnection();
        connection.setRequestProperty("Authorization", authHeaderValue);

        try (Reader reader = new InputStreamReader(connection.getInputStream())) {
            StringBuilder builder = new StringBuilder();
            while ((len = reader.read(buffer)) != -1) {
                builder.append(buffer, 0, len);
            }
            System.out.println(builder.toString());
        }
    }
}
  

Комментарии:

1. Это приводит к исключению javax.net.ssl.SSLHandshakeException: получено предупреждение о рукопожатии: непризнанное имя_имя, даже если имя пользователя на 100% правильное.

2. сообщение «javax.net.ssl.SSLHandshakeException: получено предупреждение о рукопожатии: непризнанное имя_имя», скорее всего, связано не с Java или именем пользователя, а с конфигурацией вашего хоста / веб-сервера. Если «mypath» является реальным хостом, который вы используете, убедитесь, что установлена правильная конфигурация сертификатов, имен серверов и цепочек сертификатов!