我必須調用一個需要自定義客戶端身份驗證的WS。此驗證由客戶端上運行的程序完成,並在http://127.0.0.1:80上進行偵聽。 所以我補充這樣,在啓動時的ProxySelector:爲什麼ProxySelector在HttpUrlConnection.plainConnect()中爲空?
final ProxySelector ps = new ProxySelector() {
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
ioe.printStackTrace();
}
@Override
public List<Proxy> select(URI uri) {
final List<Proxy> proxy = new ArrayList<Proxy>();
final SocketAddress adr = new InetSocketAddress("127.0.0.1", 80);
final Proxy p = new Proxy(Proxy.Type.HTTP, adr);
proxy.add(p);
return proxy;
};
ProxySelector.setDefault(ps);
這就要用到做工精細,但不是有後一些重構(不涉及WS調用),http://my.server.com作爲URI輸入,我有插座://my.server.com和它失敗,出現「未知的代理類型:HTTP」,似乎什麼用SOCKET方案很正常......
我的老之間的差異應用程序和新的一個是HttpUrlConnection.plainConnect()過程中的行爲是不一樣的。實際上,工作版本使用正確的URI(http://www.docjar.com/html/api/sun/net/www/protocol/http/HttpURLConnection.java.html的第922行), 調用了我的ProxySelector,而新版本跳轉到第959行並開始創建一個新的底層連接,最終以socket://方案結束。
所以,不同之處在於以下幾行:
ProxySelector sel =
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<ProxySelector>() {
public ProxySelector run() {
return ProxySelector.getDefault();
}
});
過去,這回我的ProxySelector爲「選擇」,但現在返回null。
有人可以解釋我究竟是什麼意思這些行,爲什麼結果是不一樣的比我的舊應用程序?