मैं इस मामले के लिए एक उत्तर देना चाहता हूं कि आपके पास कनेक्शन खोलने वाले कोड पर नियंत्रण नहीं है। जैसे मैंने प्रयोग करते समय किया थाURLClassLoader
पासवर्ड प्रोटेक्टेड सर्वर से जार फाइल लोड करने लिए ।
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
बस की जगह और सब कुछ ठीक है। मुझे पता है कि एक कंस्ट्रक्टर प्रदान करता है, लेकिन यह कारखाना उपयोग नहीं किया जाता है यदि URL एक जार फ़ाइल को इंगित करता है।http
my
URLClassLoader
URLStreamHandlerFactory