Saya ingin memberikan jawaban untuk kasus di mana Anda tidak memiliki kendali atas kode yang membuka koneksi. Seperti yang saya lakukan saat menggunakan URLClassLoader
untuk memuat file jar dari server yang dilindungi kata sandi.
The Authenticator
solusi 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 my
yang diganti http
saat kredensial ditambahkan. Jadi saat membuat yang baru URLClassLoader
ganti saja http
dengan my
dan semuanya baik-baik saja. Saya tahu URLClassLoader
menyediakan konstruktor yang membutuhkan URLStreamHandlerFactory
tetapi pabrik ini tidak digunakan jika URL mengarah ke file jar.