2011-10-05 58 views
0

我必須調用一個需要自定義客戶端身份驗證的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。

有人可以解釋我究竟是什麼意思這些行,爲什麼結果是不一樣的比我的舊應用程序?

回答

0

最終,我明白了這一點!

用於生成WS客戶端的jaxws-maven插件在工作應用程序中的版本爲1.10,並且在新版本中更改爲1.12,如上所述引入了HttpUrlConnection中的更改。

仍然不知道發生了什麼,以及相關的圖書館1.10 1.12,但之間發生變化,因此在那些創造HttpConnections :)

還是要謝謝你的方式誰看過我奇怪的問題一個相當大的差距... ^^