这真是出乎意料的行为。我正在使用 JavaFX WebView编写一个简单的网络浏览器。为了使 Web 请求通过本地代理,我编写了类似这样的代码:
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8080");
如果代理正在运行,它似乎工作正常。但是,如果不是,Java 会默默地恢复为根本不使用代理!如果代理不可用,如何强制 Java 失败?
这真是出乎意料的行为。我正在使用 JavaFX WebView编写一个简单的网络浏览器。为了使 Web 请求通过本地代理,我编写了类似这样的代码:
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8080");
如果代理正在运行,它似乎工作正常。但是,如果不是,Java 会默默地恢复为根本不使用代理!如果代理不可用,如何强制 Java 失败?
您可以使用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());
Vasily 是 WebView 开发人员之一,提供了一些示例代码来跟踪使用代理时的加载操作状态。不确定它是否会有所帮助,但你可以看看它。
瓦西里,还指出:
目前,WebEngine 没有为代理或更一般的 HTTP 身份验证提供特殊支持,但依赖于 java.net.* 堆栈在该领域提供的功能。
如果您使用JavaFX 打包任务捆绑您的应用程序:
主应用程序 JAR 文件将包含一个启动程序,该程序负责引导启动... 为您的应用程序设置系统代理
此外,请确保您使用的是最新版本的 JavaFX,因为早期版本在某些代理处理方面存在错误。
有一个代理指南,其中提到 https 有它自己的代理处理程序:(https.proxyHost 和 https.proxyPort),因此如果您的浏览器将建立 https 连接,这也是需要注意的。