Tôi muốn cung cấp câu trả lời cho trường hợp bạn không có quyền kiểm soát mã mở kết nối. Giống như tôi đã làm khi sử dụng URLClassLoader
để tải tệp jar từ máy chủ được bảo vệ bằng mật khẩu.
Các Authenticator
giải pháp sẽ làm việc nhưng có nhược điểm mà nó đầu tiên cố gắng để đạt được các máy chủ mà không có một mật khẩu và chỉ sau khi máy chủ yêu cầu một mật khẩu cung cấp một. Đó là một roundtrip không cần thiết nếu bạn đã biết máy chủ sẽ cần mật khẩu.
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;
}
}
Điều này đăng ký một giao thức mới my
được thay thế bằng http
khi thông tin đăng nhập được thêm vào. Vì vậy, khi tạo mới URLClassLoader
chỉ thay thế http
với my
và mọi thứ đều tốt. Tôi biết URLClassLoader
cung cấp một hàm tạo có một URLStreamHandlerFactory
nhưng nhà máy này không được sử dụng nếu URL trỏ đến tệp jar.