JavaFX WebView禁用同源策略(允许跨域请求)
JavaFX WebView disable Same origin policy (allow cross domain requests)
我正在开发一个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());
}
相关文章:
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- 为什么这是一个跨域请求
- 从HTTP到HTTPS的跨域请求立即中止
- 有没有任何方法可以从javascript进行跨域请求,并访问它可能生成的错误响应类型(401404等)
- 向Gmail订阅源发送跨域请求的方法有哪些
- Internet Explorer跨域请求无法正常工作,MS没有给出错误的理由
- 动态请求跨域请求的权限
- JSONP 在 IE10 中不适用于跨域请求
- 了解如何在 Jquery 中跨域请求
- 使用 jsonp 的跨域请求:从 https 到 http
- 如何获取 xml 结果(跨域请求)
- jQuery中的跨域请求仅适用于某些文件
- 为什么此跨域请求解决方法有效
- IE8 中的 Javascript 跨域请求
- 使用 AngularJS 的跨域请求不起作用
- 跨域请求的 Ajax 代码失败
- 使用身份验证标头发出跨域请求
- 没有 CORS 或 JSONP 的跨域请求
- 使用 Jquery(不是 AJAX)的跨域请求
- 如何将跨域请求从客户端发送到服务器