【问题标题】:Access is Denied Exception when calling JavaScript function from Java in IE在 IE 中从 Java 调用 JavaScript 函数时访问被拒绝异常
【发布时间】:2009-12-09 20:08:51
【问题描述】:

当我仅在 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

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

【问题讨论】:

  • 这里的代码是什么,你的文字是什么,很难读懂……你能在表示代码时使用 StackOverFlow.com 语法吗? (每行代码前放4个空格,放入codebox)
  • 我已经格式化了代码以产生更好的响应。
  • 嗯……他可能没有得到“更好”的回应……但至少现在格式正确。
  • 您使用的是什么操作系统/Java 版本?
  • 使用 Windows XP 和 JRE 版本 1.6.0_05

标签: java javascript internet-explorer liveconnect


【解决方案1】:

this 有帮助吗?

Sun 论坛上该答案的摘要:

你好,我遇到了同样的问题。我解决了,你只需要像这样实现applet方法:

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()"));

【讨论】:

  • 它仍然无济于事......我将 AccessController 包裹在我的代码上,但仍然得到 Access is Denied 异常。我应该检查 applet.policy 还是 crossdomain.xml ?
  • 我在 URL 之前有 showDocumnet url = new URL("javascript:uploadComplete()"); uploadDialogBox.applet.getAppletContext().showDocument(url, "_self");但它在 IE 中不起作用,但在 FF 中起作用。因此尝试使用 liveconnect 作为替代方案。
  • 实际上,在将我的代码包装在 AccessController 上之后,它可以在 FF 中运行,但不适用于 IE。那么归结为浏览器问题?它给出了“拒绝访问”。当 scriptObject.call("uploadComplete", null);被调用。
  • 我的猜测是这是一个浏览器问题,你的 IE 可能已被锁定,不允许外部访问 DOM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2013-09-13
  • 1970-01-01
  • 2012-11-15
  • 2012-05-19
  • 2014-11-19
  • 2018-08-17
相关资源
最近更新 更多