我正在开发一个JavaFX应用程序,它主要是一个美化的网页。它是一个桌面应用程序(它没有嵌入到网页中),并且它的主UI有一个Web View。应用程序本身的唯一目的是使用Bluecove访问蓝牙设备,因为这无法直接使用Web浏览器上的JavaScript。
概念验证工作正常(我能够从Java调用JavaScript代码,反之亦然),但我有一个额外的要求,即从JavaScript中调用任意Web服务/API,但这违反了同源策略(类似于Android:允许在Android Webview jquery移动设备中进行远程ajax调用)。这在JavaFX上可能吗?有什么提示吗?
P、 美国:我正在使用JavaFX2.2。
先看看这个答案,再看看我的答案:我如何像其他网站一样解决YouTubeAPI嵌入限制?
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());
}
由于您已经在JavaFX中作为桌面应用程序运行,您可以通过Java进行JavaScript调用,其中主域同源策略不适用。
或者,这个问题的答案,你已经张贴似乎是一个可行的选择。
基本上,javaFx存在与CORS相关的问题-https://javafx-jira.kenai.com/browse/RT-35868.假设您正在使用的Web服务启用了CORS,您可以尝试以下方法:
System.set属性("sun.net.http.allow限制标题","true")
或
希望对你有帮助
问题内容: 我正在编写一个简单的网站,该网站以一个成语作为输入,并从牛津词典返回其含义和示例。这是我的主意: 我向以下网址发送了请求: 例如,如果习惯用法是“不走远”,我将请求发送至: 然后将我重定向到以下页面: 在此页面上,我可以提取成语的含义和示例。这是我的测试代码。它将提醒响应URL: 问题是我有一个错误: 跨域请求被阻止:“同源起源”策略不允许读取http://www.oxfordlear
不幸的是,一个第三方服务IFRAME我仍然需要在我的页面是不加载了。有一种方法允许第三方域,即使嵌入策略打开? 谢了。达里奥。
问题内容: 这是我的代码: 这适用于GET请求而不是POST! 我将Apache用作服务器,并使用以下命令对其进行了配置: 在我的angularjs中,我包含在模块应用程序的配置中: 但是请求POST仍然无法正常工作! 我希望有人能提出任何想法。 问题答案: 在服务器端添加这些标头: 如果仍然无法正常工作,请发布浏览器正在发送的预检请求的详细信息。 为什么要这样做? 如果不是简单的请求(例如,表单
问题内容: 在我的项目中,我需要允许其他人向我的脚本发送ajax请求。因此,外部请求可能来自其他网站和域,也可能来自浏览器扩展。 我在脚本顶部仅添加了以下两行,以使它们能够做到: 现在我的问题是:这里是否遗漏了任何安全方面的考虑?这个简单的解决方案会带来严重的问题吗? 如果是这样,什么是更好的解决方案? 感谢您的回复。 问题答案: 如上所述,任何人都可以随时向您的页面发送请求:因此,您需要考虑的主
在我的项目中,我需要允许其他人向我的脚本发送ajax请求。因此,外部请求可能来自其他网站和域,也可能来自浏览器扩展<我只是在我的脚本顶部添加了这两行,让他们完成这项任务: 现在我的问题是:这里有我错过的任何安全考虑吗?这个简单的解决方案会产生严重的问题吗? 如果是,更好的解决方案是什么? 感谢您的回复。
问题内容: 我正在网站上使用,最近我的用户在接收邮件时遇到了这个问题。在FireBug中检查后,我意识到脚本失败是由于CORS保护(由于以下错误)所致。 跨域请求被阻止:“同源起源”策略不允许读取http://x3.chatforyoursite.com/subscribe/上的远程资源 。可以通过将资源移到同一域或启用CORS来解决此问题。 现在,我想知道应该在哪里启用CORS,因为在我自己的服