2012-09-18 46 views
0

這實在是出乎意料的行爲。我正在使用JavaFX WebView編寫簡單的Web瀏覽器。爲了使Web請求通過本地代理,我寫了類似於此的代碼:如果Java的http代理服務器關閉,它將恢復爲非代理服務器

System.setProperty("http.proxyHost", "localhost"); 
System.setProperty("http.proxyPort", "8080"); 

它似乎正常工作,如果代理正在運行。但是,如果不是,Java默默地回覆到根本不使用代理!如果代理不可用,我如何強制Java失敗?

回答

2

您可以用自定義ProxySelector只允許代理要做到這一點,並且不提供Proxy.NO_PROXY作爲一種替代方案:

import java.net.*; 
import java.util.*; 

public class AlwaysProxySelector implements ProxySelector { 
    private List<Proxy> proxies = Arrays.asList(new Proxy[] { 
     new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8080)) 
     }); 

    public List<Proxy> select(URI u) { return proxies; } 
    public void connectFailed(URI u, SocketAddress a, IOException e) {} 
} 

您安裝使用ProxySelector.setDefault(new AlwaysProxySelector());

+0

非常感謝,我今天有機會試試這個,並報告回來。 – oakes

+0

謝謝!當代理未運行時,此方法似乎可以正確拒絕連接。 – oakes

1

瓦西里這個選擇,其中一位WebView開發人員在使用代理時提供了一些sample code to track load operation status。不知道它是否會有幫助,但你可以看看它。

瓦西里,也notes

目前,WebEngine提供代理,或者更一般地說,HTTP認證沒有特殊的支持,但依靠java.net什麼*堆棧中地區提供。

如果您使用捆綁您的應用程序JavaFX packaging tasks

主要應用程序JAR文件將包括啓動程序, 需要引導啓動的照顧...... 設置爲你的應用系統代理

此外,請確保您使用的是最新版本的JavaFX,因爲早期版本中存在一些代理處理錯誤。

有一個guide to proxies,它提到https有它自己的代理處理程序:(https.proxyHost和https.proxyPort),所以如果您的瀏覽器將使用https連接,也需要注意。