আমি এই মামলার জন্য একটি উত্তর সরবরাহ করতে চাই যে সংযোগটি খোলার কোডটির উপরে আপনার নিয়ন্ত্রণ নেই। ব্যবহার করার সময় আমি যেমন করেছি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
প্রতিস্থাপন করুন এবং সবকিছু ঠিক আছে। আমি জানি একটি কনস্ট্রাক্টর সরবরাহ করে যা গ্রহণ করেhttp
my
URLClassLoader
URLStreamHandlerFactory
তবে এই কারখানাটি ব্যবহার করা হয় না যদি URL টি জার ফাইলটিতে নির্দেশ করে।