Saya ingin memberikan jawaban untuk kasus di mana Anda tidak memiliki kendali atas kode yang membuka koneksi. Seperti yang saya lakukan saat menggunakan URLClassLoaderuntuk memuat file jar dari server yang dilindungi kata sandi.
The Authenticatorsolusi akan bekerja tapi memiliki kekurangan yang pertama kali mencoba untuk mencapai server tanpa password dan hanya setelah server meminta password menyediakan satu. Itu adalah perjalanan bolak-balik yang tidak perlu jika Anda sudah mengetahui bahwa server memerlukan kata sandi.
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;
}
}
Ini mendaftarkan protokol baru myyang diganti httpsaat kredensial ditambahkan. Jadi saat membuat yang baru URLClassLoaderganti saja httpdengan mydan semuanya baik-baik saja. Saya tahu URLClassLoadermenyediakan konstruktor yang membutuhkan URLStreamHandlerFactorytetapi pabrik ini tidak digunakan jika URL mengarah ke file jar.