JavaFX WebView中的“完整性元数据检查失败。”会忽略SystemProp

时间:2018-09-29 21:53:58

标签: java javafx kotlin webkit javafx-8

我正在尝试打开Microsoft auth v2的Web视图。在浏览器中可以很好地加载,但是在JavaFX的WebView(JDK 8)中,该页面为空白。打开控制台输出后,我会看到许多行,例如CSS和JS。

[null:0] Cannot load stylesheet https://secure.aadcdn.microsoftonline-p.com/ests/2.1.8148.16/content/cdnbundles/converged.v2.login.min_t7iocdq0wq2qh0nv233jig2.css. Failed integrity metadata check.

我相对确定问题出在CORS(我正在加载microsoftonline.com,资源在microsoftonline-p.com上)。我已经尝试过所有可以想到的解决方案,也可以在网上找到它们。

我尝试设置所有这些

engine.setJavaScriptEnabled(true)

engine.setUserAgent("AppleWebKit/537.44")

System.setProperty("sun.net.http.allowRestrictedHeaders", "true")

我还通过-Dsun.net.http.allowRestrictedHeaders=true中的VMOptions(如here)和JavaFX问题JDK-8096797

设置了属性。

该属性显示为已设置:

println(System.getProperty("sun.net.http.allowRestrictedHeaders"))

在控制台打印输出上产生true

页面输出仍然没有变化,始终是白色的空白屏幕,并且来自Web控制台。

我想我什至找到了trouble lines in WebKit(see matchIntegrityMetadata),但这并没有帮助我解决问题,因为我不知道如何禁用 integrityCheck

这真的让我感到难过。我们非常感谢您的任何帮助。

作为参考,下面是整个方法:

private fun WebView.authWindow(provider: Oath2Account){
    engine.setUserAgent("AppleWebKit/537.44")
    engine.setJavaScriptEnabled(true)
    URLPermission("https://*.com")
    System.setProperty("sun.net.http.allowRestrictedHeaders", "true")

    Platform.runLater {
        engine.userDataDirectory = File("C:\\users\\eric\\javafx_tmp")
        engine.setOnError { println("IN PAGE ERROR --> $it") }
        engine.setOnAlert { println("IN PAGE ALERT --> $it") }
        engine.setConfirmHandler { println("IN PAGE CONFIRM HANDLER --> $it")
        true
        }
        engine.setCreatePopupHandler { println("IN PAGE POPUP --> $it")
        engine}
        engine.setOnResized {   println("IN PAGE RESIZED --> $it") }
        engine.setOnStatusChanged {   println("IN PAGE STATUS CHANGED --> $it")
            println("\t${it.data}")
            println("\t${it.source}")
            println("\t${it.eventType}")
            println("\t${it.target}")
            println("\t${it.isConsumed}")

        }
        engine.setOnVisibilityChanged { println("IN PAGE VISIBILITY CHANGED --> $it") }
        engine.setPromptHandler { println("IN PAGE PROMPTED --> $it")
        "HELLO"}
        println("JavaScript engine status: ${engine.isJavaScriptEnabled}")

        println("engine is loading $loadURL")
        engine.locationProperty().addListener { observable, oldLocation, newLocation->
            println("observable=$observable\noldLocation=$oldLocation\nnewLocation=$newLocation")
            //          if (newLocation.startsWith("urn:ietf:wg:oauth:2.0:oob")) {
            //              val code:get
            //              val title:from
            //              val accessToken = service.getAccessToken(verifier)
            //              doSomething(accessToken.getAccessToken())
            //          }
        }
        com.sun.javafx.webkit.WebConsoleListener.setDefaultListener { webview, message, lineNumber, sourceId -> println("Console: [$sourceId:$lineNumber] $message") }
        engine.setOnError({ event -> System.out.println(event.getMessage()) })
        try{
        engine.load(loadURL )
    } catch (e: IOException) {
        println("caught error:")
        e.printStackTrace();
    }
}

3 个答案:

答案 0 :(得分:1)

这证实了我的回答:Javafx - open login.microsoftonline.com page in webview component

关键点是外部脚本/链接完整性失败。这不是平台浏览器的问题,JavaFX(OpenJFK)依赖嵌入式Webkit引擎。

在Windows JDK 8上,版本40和172之间发生了回归。它与Oracle JDK 9.0.4正常工作,与Oracle JDK 11不兼容

更多详细信息,请访问:https://github.com/mguessan/davmail/issues/12

=>更新:经Windows和Linux上的OpenJFX团队确认的问题, 看到: https://github.com/javafxports/openjdk-jfx/issues/230 和 [WebView]在Windows和Linux上子资源完整性检查失败 https://bugs.openjdk.java.net/browse/JDK-8219917

=>更新了答案:已实现以覆盖Microsoft表单内容并禁用完整性检查。这不是Webkit错误的修复,只是解决方法

try {
    URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory() {
        @Override
        public URLStreamHandler createURLStreamHandler(String protocol) {
            if ("https".equals(protocol)) {
                return new sun.net.www.protocol.https.Handler() {
                    @Override
                    protected URLConnection openConnection(URL url, Proxy proxy) throws IOException {
                        System.out.println("openConnection " + url);

                        if (url.toExternalForm().endsWith("/common/handlers/watson")) {
                            System.out.println("Failed: form calls watson");
                        }
                        final HttpsURLConnectionImpl httpsURLConnection = (HttpsURLConnectionImpl) super.openConnection(url, proxy);
                        if ("login.microsoftonline.com".equals(url.getHost())
                                && "/common/oauth2/authorize".equals(url.getPath())) {

                            return new URLConnection(url) {
                                @Override
                                public void connect() throws IOException {
                                    httpsURLConnection.connect();
                                }

                                public InputStream getInputStream() throws IOException {
                                    byte[] content = readFully(httpsURLConnection.getInputStream());
                                    String contentAsString = new String(content, "UTF-8");
                                    System.out.println(contentAsString);
                                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                                    baos.write(contentAsString.replaceAll("integrity", "integrity.disabled").getBytes("UTF-8"));
                                    return new ByteArrayInputStream(baos.toByteArray());
                                }

                                public OutputStream getOutputStream() throws IOException {
                                    return httpsURLConnection.getOutputStream();
                                }

                            };

                        } else {
                            return httpsURLConnection;
                        }
                    }

                };
            }
            return null;
        }
    });
} catch (Throwable t) {
    System.out.println("Unable to register custom protocol handler");
}

答案 1 :(得分:0)

我发现,Web视图使用的是Mac OS / Linux OS的Webkit引擎和Windows计算机的IE引擎。我有类似的问题Javafx - open login.microsoftonline.com page in webview component。在Mac OS上的WebView可以正常工作,但是Windows机器上存在问题。当我调查此问题时,我发现此IE引擎存在问题。我可以访问几台安装了不同版本IE 11的计算机。在具有update version 11.0.85的计算机上,我无法打开此站点,但是当我在具有update version 11.0.90的计算机上尝试时,该问题不再存在。因此,如果您使用的是Windows操作系统,请尝试更新IE版本,也许它将解决您的问题。

答案 2 :(得分:0)

如果还有人遇到这个问题,那么您可以通过将您的 JDK 或 JRE 版本更新到 1.8.0_281 或更高版本来解决这个问题。