在JavaFX WebEngine上设置代理?

use*_*446 7 java proxy javafx webview

如何为每个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);
}
Run Code Online (Sandbox Code Playgroud)

这启动了谷歌页面的窗口就好了.

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

小智 5

部署概述来看

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);    
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这对我来说似乎很混乱。它可能会错过诸如用户单击 WebView 内的链接或执行 XmlHttpRequest 等操作的脚本之类的事情。我不会推荐这个,除非你别无选择。