java - JavaFX 应用程序中的 iFrame 在 Linux 上运行时不加载某些页面

标签 java linux iframe webview javafx

在我的 Java FX 应用程序中,我应该加载一个简单的 HTML 页面,其中包含一个显示外部网站的 iframe。我知道我可以使用 webEngine.load() 加载网站,但作为要求,我必须以这种方式实现它(我正在尝试将 Duo Security Web SDK 合并到我们的 Java 应用程序中)。

在 Windows 上,一切正常。然而,某些网站无法在 Linux(Debian、Fedora)上加载。我可以显示 gmail (https)、espn.com 或 en.wikipedia.org 等网站。但是谷歌和雅虎不会加载。我不认为这是 https 或 flash 问题。请参阅下面的代码。

Java:

webEngine.getLoadWorker().stateProperty().addListener(
    new javafx.beans.value.ChangeListener<State>() {
        @Override
        public void changed(ObservableValue ov, State oldState, State newState) {
            if (newState == State.SUCCEEDED) {
                webEngine.executeScript(
                      "window.duoHost = '"+duoHost+"';"
                    + "window.duoSigRequest = '"+duoSigRequest+"';"
                    + "loadDuoOptions();");
                JSObject jsobj = (JSObject) webEngine.executeScript("window");
                jsobj.setMember("java", new Bridge());
                System.out.println("Set up done");
            }
        }
    });

HTML:

<head>
<title>Designer Login with Duo </title>
<script src="Duo-Web-v1.bundled.js"></script>
<script>
    function loadDuoOptions(){
        Duo.init({
            'host' :  window.duoHost,
            'sig_request' : window.duoSigRequest 
        });
        Duo.ready();
    }
    window.processDuoResponse = function(data){
        duoResponse = data;
        loginHandler.verifyDuoResponse(duoResponse);
    }
</script>
</head>
<body>
<iframe id="duo_iframe" width="500" height="500" frameborder="0"></iframe>
</html>

最佳答案

这修复了 HTTPS:

private void installCertificateVerificationBypassTools() {
    this.installCustomTrustManager();
    this.installCustomHostNameverifier();

}

private void installCustomTrustManager() {
    System.out.println("Installing custom trust manager");
    try {
        TrustManager[] nonDiscriminantTrustManager = new TrustManager[]{new X509TrustManager() {
            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                // ignore client trust check
            }

            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                // ignore server trust check
            }
        }};
        final SSLContext ret = SSLContext.getInstance("SSL");
        ret.init(null, nonDiscriminantTrustManager, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(ret.getSocketFactory());
    } catch (KeyManagementException | NoSuchAlgorithmException ex) {

    }
}

private void installCustomHostNameverifier() {
    System.out.println("Installing custom hostname verifier");
    HostnameVerifier hv = new HostnameVerifier() {
        @Override
        public boolean verify(String string, SSLSession ssls) {
            System.out.println("Verifying connection...");
            showSSLSessionDetails(ssls);
            if (ssls.getProtocol().contains("https")) {
                System.out.println("https session allowed.");
            }
            return true;
        }
    };
    HttpsURLConnection.setDefaultHostnameVerifier(hv);
}

myClass extends Application 类的 public void start(Stage mainStage) 方法中使用 installCertificateVerificationBypassTools()

请注意,这接受所有传入的证书。

关于java - JavaFX 应用程序中的 iFrame 在 Linux 上运行时不加载某些页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316103/

相关文章:

iframe - 可以在 svg 中嵌入 youtube 视频吗?

javascript - iframe 刷新时更改 URL

java - JBoss接缝: inject in @Create method possible?

java - 跳过一些特殊字符

java - 使用Javamail获取附件

linux - 基于两列在awk中增加变量

node.js - Docker buildx 与 Apple M1 芯片上的 Node 应用程序 - standard_init_linux.go :211: exec user process caused "exec format error

Linux - 从一个文件中获取一行并从第二个文件中获取相应的行并传递给 cp 命令

java - 清除eclipse缓存 "referenced file contains error"问题

jquery - 使用 live() 获取加载的 iframe 内容