我正在开发一个JavaFX应用程序,它主要是一个美化的网页。它是一个桌面应用程序(它没有嵌入到网页中),并且它有一个用于主UI的web视图。应用程序本身服务于使用Bluecove访问蓝牙设备的唯一目的,因为这不可能直接在web浏览器上使用JavaScript。
概念验证工作正常(我可以从Java调用JavaScript代码,反之亦然),但我有一个额外的要求,需要从JavaScript内部调用任意web服务/API,但这违反了同源策略(与Android上的类似:Allow remote ajax calls in an Android Webview + jquery mobile)。在JavaFX上这是可能的吗?有什么建议吗?
附言:我使用的是JavaFX 2.2。
发布于 2014-09-29 21:38:49
基本上,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>希望能对你有所帮助
发布于 2013-09-03 14:23:23
由于您已经在JavaFX中作为桌面应用程序运行,因此可以通过Java进行JavaScript调用,而同源策略不适用。
或者,this answer to the SO question you've posted似乎是一个可行的替代方案。
发布于 2019-11-23 18:57:27
先看下面的答案,然后再看我的答案: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());
}https://stackoverflow.com/questions/16215844
复制相似问题