Я хотів би надати відповідь на випадок, коли у вас немає контролю над кодом, який відкриває з'єднання. Як я це робив під час URLClassLoader
завантаження файлу jar із захищеного паролем сервера.
Authenticator
Рішення буде працювати , але має той недолік , що він перший намагається отримати доступ до сервера без пароля , і тільки після того , як сервер запитує пароль забезпечує один. Це зайвий зворотній пробіг, якщо ви вже знаєте, що серверу потрібен пароль.
public class MyStreamHandlerFactory implements URLStreamHandlerFactory {
private final ServerInfo serverInfo;
public MyStreamHandlerFactory(ServerInfo serverInfo) {
this.serverInfo = serverInfo;
}
@Override
public URLStreamHandler createURLStreamHandler(String protocol) {
switch (protocol) {
case "my":
return new MyStreamHandler(serverInfo);
default:
return null;
}
}
}
public class MyStreamHandler extends URLStreamHandler {
private final String encodedCredentials;
public MyStreamHandler(ServerInfo serverInfo) {
String strCredentials = serverInfo.getUsername() + ":" + serverInfo.getPassword();
this.encodedCredentials = Base64.getEncoder().encodeToString(strCredentials.getBytes());
}
@Override
protected URLConnection openConnection(URL url) throws IOException {
String authority = url.getAuthority();
String protocol = "http";
URL directUrl = new URL(protocol, url.getHost(), url.getPort(), url.getFile());
HttpURLConnection connection = (HttpURLConnection) directUrl.openConnection();
connection.setRequestProperty("Authorization", "Basic " + encodedCredentials);
return connection;
}
}
Це реєструє новий протокол, my
який замінюється, http
коли додаються облікові дані. Тому при створенні нового URLClassLoader
просто замінити http
з my
і все в порядку. Я знаю, URLClassLoader
надає конструктор, який займає, URLStreamHandlerFactory
але ця фабрика не використовується, якщо URL-адреса вказує на файл jar.