연결을 여는 코드를 제어 할 수없는 경우에 대한 답변을 제공하고 싶습니다. URLClassLoader
암호로 보호 된 서버에서 jar 파일을로드하기 위해 를 사용할 때와 마찬가지로 .
이 Authenticator
솔루션은 작동하지만 먼저 암호없이 서버에 도달하려고 시도하고 서버가 암호를 요청한 후에 만 암호를 제공한다는 단점이 있습니다. 서버에 비밀번호가 필요하다는 것을 이미 알고 있다면 불필요한 왕복입니다.
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;
}
}
자격 증명이 추가 될 때 my
대체되는 새 프로토콜 을 등록합니다 http
. 그래서 새로 만들 때 URLClassLoader
그냥 교체 http
하면 my
모든 것이 좋습니다. 알아URLClassLoader
를 사용하는 생성자를 제공 URLStreamHandlerFactory
하지만,이 공장은 jar 파일에 대한 URL 포인트 경우 사용되지 않습니다.