Ich möchte eine Antwort für den Fall geben, dass Sie keine Kontrolle über den Code haben, der die Verbindung öffnet. Wie ich es getan habe, als ich URLClassLoader
eine JAR-Datei von einem passwortgeschützten Server geladen habe.
Die Authenticator
Lösung würde funktionieren, hat jedoch den Nachteil, dass zuerst versucht wird, den Server ohne Kennwort zu erreichen, und erst, nachdem der Server nach einem Kennwort gefragt hat, eines bereitgestellt wird. Dies ist eine unnötige Rundreise, wenn Sie bereits wissen, dass der Server ein Kennwort benötigt.
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;
}
}
Dadurch wird ein neues Protokoll registriert, my
das http
beim Hinzufügen von Anmeldeinformationen ersetzt wird. So bei der Erstellung der neuen URLClassLoader
ersetzen Sie einfach http
mit my
und alles ist in Ordnung. Ich weiß, URLClassLoader
dass ein Konstruktor bereitgestellt wird, der eine verwendet, URLStreamHandlerFactory
aber diese Factory wird nicht verwendet, wenn die URL auf eine JAR-Datei verweist.