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 URLClassLoadereine JAR-Datei von einem passwortgeschützten Server geladen habe.
Die AuthenticatorLö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, mydas httpbeim Hinzufügen von Anmeldeinformationen ersetzt wird. So bei der Erstellung der neuen URLClassLoaderersetzen Sie einfach httpmit myund alles ist in Ordnung. Ich weiß, URLClassLoaderdass ein Konstruktor bereitgestellt wird, der eine verwendet, URLStreamHandlerFactoryaber diese Factory wird nicht verwendet, wenn die URL auf eine JAR-Datei verweist.