在JavaFX WebEngine上设置代理?

时间:2014-07-11 06:36:55

标签: java webview proxy javafx

如何为每个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窗口的代理

4 个答案:

答案 0 :(得分:3)

来自deployment overview

  

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网站