在IE中从Java调用JavaScript函数时,Access是Denied Exception

时间:2009-12-09 20:08:52

标签: java javascript internet-explorer liveconnect

当我仅在IE中从Java Applet调用Java脚本函数时,我得到了Access Denied异常。 (用最新信息修改了我的原始问题。)

这是我的HTML代码

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

ju在同一页面中全局声明,该页面从不同的JavaScript文件调用doneUpload。我在我的applet标签中包含了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函数。我在这做错了什么?

1 个答案:

答案 0 :(得分:1)

this有帮助吗?

Sun论坛上该答案的摘要:

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

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

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

编辑:好的,第二个可能的解决方案是使用this article中描述的getDocument()。一句警告,在我们的测试中,我们已经看到这在Mac上的Firefox上并不总是可靠的。这种方法的实质是:

getAppletContext().showDocument(new URL("javascript:uploadComplete()"));