【问题标题】:JavaFX WebView disable Same origin policy (allow cross domain requests)JavaFX WebView 禁用同源策略(允许跨域请求)
【发布时间】:2013-04-19 09:53:32
【问题描述】:

我正在开发一个 JavaFX 应用程序,它主要是一个美化的网页。它是一个桌面应用程序(它没有嵌入到网页中),并且它有一个用于主 UI 的 Web 视图。该应用程序本身的唯一目的是使用 Bluecove 访问蓝牙设备,因为这无法直接使用 Web 浏览器上的 JavaScript。

概念证明工作正常(我可以从 Java 调用 JavaScript 代码,反之亦然),但我有一个额外的要求是从 JavaScript 中调用任意 Web 服务/API,但这违反了同源策略(类似于这在 Android 上:Allow remote ajax calls in an Android Webview + jquery mobile)。这在 JavaFX 上可行吗?有什么建议吗?

P.S.:我使用的是 JavaFX 2.2。

【问题讨论】:

    标签: javascript cross-domain javafx same-origin-policy


    【解决方案1】:

    先看这个答案,再看我的答案:How can I work around YouTube API embed restrictions like other websites?

    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());
    }
    
    
    
    

    【讨论】:

    • 也许你可以解释一下你的答案
    【解决方案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>

    希望对你有帮助

    【讨论】:

      【解决方案3】:

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

      另外,this answer to the SO question you've posted 似乎是一个可行的替代方案。

      【讨论】:

        猜你喜欢
        • 2017-05-09
        • 2021-04-04
        • 2014-10-17
        • 2015-07-22
        • 2018-04-20
        • 2014-07-20
        相关资源
        最近更新 更多