如何为每个WebView实例设置代理 ?
这是我到目前为止所做的:
public void start(Stage stage) {
StackPane root = new StackPane();
WebView view = new WebView();
WebEngine engine = view.getEngine();
engine.load("https://www.google.com");
root.getChildren().add(view);
Scene scene = new Scene(root, 960, 640);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) throws IOException {
Application.launch(args);
}
启动谷歌页面的窗口就好了。
但是如何设置代理呢? 不是VM系统代理,而是每个WebView窗口的代理。
答案 0 :(得分:3)
3.2.3内置代理支持
正确打包的JavaFX应用程序具有根据Java运行时配置设置初始化的代理设置。默认情况下,这意味着如果应用程序嵌入到网页中,将从当前浏览器获取代理设置,或者将使用系统代理设置。默认情况下,在所有执行模式下都会初始化代理设置。
可能无法为每个WebView实例进行设置。我想到了一个黑客,但我真的不想这样做 - 扩展WebView,这样每当用户(以及WebView中的脚本等)与之交互时,它就会调用System.setProperty("http.proxy",this.myProxy)
。类似的东西:
class KludgeWebView extends WebView {
String myProxy;
String myProxyPort;
String sysProxy;
String sysProxyPort;
KludgeWebView()
{
super();
sysProxy = System.getProperty("http.proxy");
sysProxyPort = System.getProperty("http.proxyPort");
}
public void load(String url)
{
useProxy();
super.load(url);
revertProxy();
}
public void useProxy()
{
System.setProperty("http.proxy",myProxy);
System.setProperty("http.proxyPort", myProxyPort);
}
public void revertProxy()
{
System.setProperty("http.proxy",sysProxy);
System.setProperty("http.proxyPort", sysProxyPort);
}
}
然而,这对我来说似乎非常混乱。它可能会遗漏用户单击WebView内部链接或脚本执行XmlHttpRequest之类的操作。除非你没有别的选择,否则我不会推荐这个。
答案 1 :(得分:2)
http.proxy不起作用,我不得不使用http.proxyHost。
System.setProperty("http.proxyHost","proxy.esrf.fr");
System.setProperty("http.proxyPort","3128");
答案 2 :(得分:0)
我已经尝试了上面的所有答案,但没有一个适合我。我还尝试使用
更改系统设置System.setProperty("http.proxyHost","your proxy address");
System.setProperty("http.proxyPort","your port");
但这也行不通。我发现唯一可行的解决方案是让您的Java应用程序使用
运行命令Runtime.getRuntime().exec(CHANGE_PROXY_CMD);
这将通过修改注册表设置来更改系统代理设置。任何方式都无法为每个Web实例设置代理,因为它在javafx文档中有明确说明。
有三个命令
就是这样。
public void changeProxySettings(String ip, String port) {
StringBuffer output = new StringBuffer();
System.setProperty("java.net.useSystemProxies", "true");
String ENABLE_PROXY_CMD = " reg add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" \n" + " /v ProxyEnable /t REG_DWORD /d 1 /f";
String CHANGE_PROXY_CMD = "reg add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" \n" + " /v ProxyServer /t REG_SZ /d " + ip + ":" + port + " /f";
String DISABLE_PROXY_CMD = "reg add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" \n" + " /v ProxyEnable /t REG_DWORD /d 0 /f";
Process processEnableProxy, processChangeProxy, processDisableProxy;
try {
processEnableProxy = Runtime.getRuntime().exec(ENABLE_PROXY_CMD);
processEnableProxy.waitFor();//makes the current thread to wait until system settings are applied
processChangeProxy = Runtime.getRuntime().exec(CHANGE_PROXY_CMD);
processChangeProxy.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(processEnableProxy.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(output.toString());
}
答案 3 :(得分:0)
你应该使用
System.setProperty("http.proxyHost","your proxy address");
System.setProperty("http.proxyPort","your port");
用于http网站和
System.setProperty("https.proxyHost","your proxy address");
System.setProperty("https.proxyPort","your port");
用于https网站