#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» является реальным хостом, который вы используете, убедитесь, что установлена правильная конфигурация сертификатов, имен серверов и цепочек сертификатов!