0

当我仅在 IE 中从 Java Applet 调用 Java 脚本函数时,我收到拒绝访问异常。(用更新的信息修改了我原来的问题。)

这是我的 HTML 代码

<script type="text/javascript">
   function uploadComplete() {
       alert("in Upload Complete");
       ju.doneUpload(true);
   }
</script>

ju在从不同 JavaScript 文件调用 doneUpload 的同一页面中全局声明。我在我的小程序标签中包含了 MAYSCRIPT。

Java 代码【添加 AccessController 后】:

 AccessController.doPrivileged(new PrivilegedAction<Object>() {
 public Object run() {

JSObject scriptObject = getScriptObject(uploadDialogBox.applet);
if(scriptObject != null) {
    try {
        // this is the call where it   throws an exception
       **scriptObject.call("uploadComplete", null);**
    } catch(JSException e) {
        System.out.println("exception " + e.getMessage() 
            + " WrappendException " + e.getWrappedException()
            + " stack trace " + e.getStackTrace());
    }
}
return null;
}

});

private JSObject getScriptObject(JApplet appletInstance) {
    JSObject result = null;
    // JSObject doc = null;
    try {
        result = JSObject.getWindow(appletInstance);
        // doc = (JSObject) result.getMember("document");
    } catch (JSException e) {
        System.out.println("Exception in getScriptObject : " + e.getMessage()
            + " Wrappend exception " + e.getWrappedException());
    }
    return result;
}

它抛出一个JSException: Access is denied

中的alert函数uploadComplete没有被调用。我在这里做错了什么?

4

1 回答 1

1

有帮助吗?

Sun论坛上该答案的摘要:

你好,我有同样的问题。我解决了,你只需要实现这样的小程序方法:

public void f() {
   AccessController.doPrivileged(new PrivilegedAction<Object>() {
      public Object run() {
         // do something
         return null;
      }
   });
}

这种方法的唯一问题是,当你第一次调用方法时,响应需要相当长的时间(4-5s),并且每次下一次,都会立即响应。

编辑:好的,第二个潜在的解决方案是使用本文中描述的 getDocument() 。警告一句,在我们的测试中,我们发现这在 Mac 上的 Firefox 上并不总是可靠的。这种方法的本质是:

getAppletContext().showDocument(new URL("javascript:uploadComplete()"));
于 2009-12-09T20:47:08.983 回答