JavaFX WebView禁用同源策略(允许跨域请求)

JavaFX WebView disable Same origin policy (allow cross domain requests)

本文关键字:许跨域 请求 策略 WebView JavaFX      更新时间:2023-09-26

我正在开发一个JavaFX应用程序,它主要是一个美化的网页。它是一个桌面应用程序(它没有嵌入到网页中),它有一个web View作为主UI。该应用程序本身的唯一目的是使用Bluecove访问蓝牙设备,因为在web浏览器上直接使用JavaScript是不可能的。

概念的证明工作ok(我能够从Java调用JavaScript代码,反之亦然),但我有一个额外的要求,从JavaScript中调用任意web服务/API,但这违反了同源策略(类似于Android:允许远程ajax调用Android Webview + jquery移动)。这在JavaFX上可能吗?任何建议吗?

注::我正在使用JavaFX 2.2.

基本上,javaFx有与CORS - https://javafx-jira.kenai.com/browse/RT-35868相结合的问题。假设您正在使用的web服务启用了CORS,您可以尝试以下方法:

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

  • java -Dsun.net.http.allowRestrictedHeaders=true <your main class here>

希望对你有帮助

由于您已经在JavaFX中作为桌面应用程序运行,您可以通过Java进行JavaScript调用,其中同源策略不适用。

或者,你贴出的这个SO问题的答案似乎是一个可行的选择。

先看看这个答案,然后看看我的答案:我如何才能像其他网站一样绕过YouTube API嵌入限制?

if ("sun/net/www/protocol/http/HttpURLConnection".equals(className)) {
        try {
            CtClass ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));
            CtMethod method = ctClass.getDeclaredMethod("getFilteredHeaderFields");
            // inject cross domain code
            injectCrossDomain(method);
            byteCode = ctClass.toBytecode();
            ctClass.detach();
        } catch (Exception e) {
            e.printStackTrace();
            throw new CatalinaException(e);
        }
}

----------------injectCrossDomain----------------
private void injectCrossDomain(CtMethod method) throws CannotCompileException {
        StringBuilder sb = new StringBuilder();
        sb.append("if (this.filteredHeaders != null) {");
        sb.append("    return this.filteredHeaders;");
        sb.append("} else {");
        sb.append("    java.util.HashMap var2 = new java.util.HashMap();");
        sb.append("    java.util.Map var1;");
        sb.append("    if (this.cachedHeaders != null) {");
        sb.append("        var1 = this.cachedHeaders.getHeaders();");
        sb.append("    } else {");
        sb.append("        var1 = this.responses.getHeaders();");
        sb.append("    }");
        sb.append("    java.util.Iterator var3 = var1.entrySet().iterator();");
        sb.append("    while(var3.hasNext()) {");
        sb.append("        java.util.Map.Entry var4 = (java.util.Map.Entry)var3.next();");
        sb.append("        String var5 = (String)var4.getKey();");
        sb.append("        java.util.List var6 = (java.util.List)var4.getValue();");
        sb.append("        java.util.ArrayList var7 = new java.util.ArrayList();");
        sb.append("        java.util.Iterator var8 = var6.iterator();");
        sb.append("        while(var8.hasNext()) {");
        sb.append("            String var9 = (String)var8.next();");
        sb.append("            String var10 = this.filterHeaderField(var5, var9);");
        sb.append("            if (var10 != null) {");
        sb.append("                var7.add(var10);");
        sb.append("            }");
        sb.append("        }");
        sb.append("        if (!var7.isEmpty()) {");
        // insert Access-Control-Allow-Origin:*
        sb.append("            var2.put('"Access-Control-Allow-Origin'", java.util.Collections.singletonList('"*'"));");
        // insert Access-Control-Allow-Headers:*
        sb.append("            var2.put('"Access-Control-Allow-Headers'", java.util.Collections.singletonList('"*'"));");
        sb.append("            var2.put(var5, java.util.Collections.unmodifiableList(var7));");
        sb.append("        }");
        sb.append("    }");
        sb.append("    return this.filteredHeaders = java.util.Collections.unmodifiableMap(var2);");
        sb.append("}");
        method.setBody(sb.toString());
}