【问题标题】:Set proxy on JavaFX WebEngine?在 JavaFX WebEngine 上设置代理?
【发布时间】:2014-09-01 17:01:55
【问题描述】:

如何为每个 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);
}

这会启动一个带有 google 页面的窗口。

但是如何设置代理? 不是 VM 系统代理,而是每个 WebView 窗口的代理

【问题讨论】:

  • 有人在吗?这方面的文档很少。

标签: java webview proxy javafx


【解决方案1】:

你应该使用

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

【讨论】:

    【解决方案2】:

    我已经尝试了上述所有答案,但没有一个对我有用。我也尝试使用

    更改系统设置
    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】:

      http.proxy 不起作用,我不得不使用 http.proxyHost。

      System.setProperty("http.proxyHost","proxy.esrf.fr");
      System.setProperty("http.proxyPort","3128");
      

      【讨论】:

        【解决方案4】:

        来自deployment overview

        3.2.3 内置代理支持

        正确打包的 JavaFX 应用程序具有根据 Java 运行时配置设置初始化的代理设置。默认情况下,这意味着如果应用程序嵌入到网页中,将从当前浏览器获取代理设置,或者将使用系统代理设置。代理设置在所有执行模式下默认初始化。

        可能无法针对每个 WebView 实例进行设置。想到了一个 hack,但我真的不想这样做 - 扩展 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 之类的脚本之类的事情。除非您别无选择,否则我不会推荐这个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-01
          • 2013-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-21
          • 1970-01-01
          相关资源
          最近更新 更多