我正在使用gwtai将java applet集成到我的gwt项目中。从我的主应用程序到applet的基本通信(例如调用返回int或boolean值的简单方法)可以正常工作。
但是我需要集成这个applet的主要原因是,我需要它连接到另一台服务器并接收答案并将其传递给我的gwt-application。
所以applet中有一个基本方法:
public String SendAndReceive(String host, int sendPort, int receivePort, String query)
连接到服务器,接收答案并以字符串形式返回此答案。
当我现在尝试像这样调用这个方法时:
applet.SendAndReceive("0.0.0.0", 9099, 2000, "show streams;");
我经常遇到以下错误(最后的完整错误消息):
com.google.gwt.core.client.JavaScriptException: (String): Error calling method on NPObject! [plugin exception: java.security.AccessControlException: access denied (java.util.PropertyPermission * read,write)]
我找不到解决方案(对于gwtai是一个非常罕见的话题),我发现的(以及Exception让我们假设的是),有一个安全问题 - 也许是因为我连接到另一台服务器。我还阅读了一些关于浏览器的单一来源策略的内容,指向同一方向的内容......到目前为止,我从未使用过java applet。
因此,如果某人有解决方案或提示,我会非常感激。如果更多代码是有用的,我可以给。
谢谢,
安迪
完整的错误消息:
21:03:49.864 [ERROR] [follovizergwt]无法加载模块入口点类follovizer.gwt.client.FolloVizerGWT(有关详细信息,请参阅相关的异常) com.google.gwt.core.client.JavaScriptException:(String):在NPObject上调用方法时出错! [插件异常:java.security.AccessControlException:访问被拒绝(java.util.PropertyPermission * read,write)]。 在com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:195) 在com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:120) 在com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:507) 在com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:264) 在com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91) at follovizer.gwt.client.AnduINAppletImpl.SendAndReceive(AnduINAppletImpl.java) 在follovizer.gwt.client.FolloVizerGWT.createLayout(FolloVizerGWT.java:92) 在follovizer.gwt.client.FolloVizerGWT.onModuleLoad(FolloVizerGWT.java:40) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597) 在com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:369) 在com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:185) 在com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:380) 在com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:222) 在java.lang.Thread.run(Thread.java:619)
答案 0 :(得分:0)
与其他浏览器插件一样,Java Applet具有security restrictions。值得注意的是,他们只能与他们来自的主机建立网络连接。您无法使用小程序连接到任意服务器。
与其他服务器通信是一个相当普遍的要求,有几种方法可以解决它。常见的解决方案是Flash + Crossdomain.xml和JSONP。还有其他解决方案,只需谷歌搜索所有可能的解决方案。
答案 1 :(得分:0)
如果您的Java小程序需要发出跨域请求,则需要对其进行签名。默认情况下,Java沙箱不允许applet获取驻留在域中的页面不同于applet源自的域。