safari - 从 Javascript 调用时,在 PrivilegedAction 内包含代码的签名小程序会抛出 PrivilegedAccessException

标签 safari applet

我有一个签名的小程序,它在 PrivilegedAction 中执行一些代码。

public String somePublicMethod()
{
        String str = (String) AccessController.doPrivileged(new PrivilegedAction() 
        {
            public Object run() 
            {
                return someMethodThatReturnsAString();
            }
        });
        return str;
}

这里的方法 someMethodThatReturnsAString 位于父类(super class)中,并且该类位于也经过签名的第三方 jar 中。从 Javascript 调用时,somePublicMethod 抛出以下异常

java.security.PrivilegedActionException: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(SecureInvocation.java:128)
at sun.plugin.liveconnect.SecureInvocation.access$300(SecureInvocation.java:51)
at sun.plugin.liveconnect.SecureInvocation$CallMethodThread.run(SecureInvocation.java:177)
Caused by: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation$2.run(SecureInvocation.java:147)
... 4 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.plugin.javascript.JSInvoke.invoke(JSInvoke.java:20)
at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.plugin.javascript.JSClassLoader.invoke(JSClassLoader.java:72)
at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(SecureInvocation.java:651)
... 6 more
Caused by: java.lang.NullPointerException
at java.lang.String.replace(String.java:2207)
... 16 more

这只发生在安装了 Java 1.6 的 Mac OS X 中的 Safari 中。当 Java 1.5 安装在客户端计算机上时,可以按预期工作。

我在 StackOverflow 上看到了类似的问题,其中讨论了从签名小程序抛出的 AccessControlException。但这是不同的,因为抛出的异常是 PrivilegedAccessException,并且小程序将代码作为特权操作执行,如这些问题的答案中所建议的。

我什至尝试过使用 PrivilegedExceptionAction 但这没有帮助。有人遇到过这种情况吗?

最佳答案

我找到了这个问题的解决方案。问题不在于小程序,而在于 JavaScript 中处理小程序方法返回的字符串的代码。该字符串被视为 Java 对象而不是 JavaScript 对象,这导致 Safari 出现问题。将 Java 字符串转换为 JavaScript 字符串解决了该问题。

我无法在浏览器的错误控制台中获取完整的堆栈跟踪,因此我依赖于 Java 控制台日志。日志消息有点误导,因为看起来此错误源自小程序。

关于safari - 从 Javascript 调用时,在 PrivilegedAction 内包含代码的签名小程序会抛出 PrivilegedAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7358480/

相关文章:

Javascript HTML5 拖动事件在 Safari (Mac) 上未触发,拖动不起作用

java - 如何使用java web applet访问系统文件?

java - 如何将消息从 Javascript 发送到 Java?

java - 在 Java Applet 中嵌入共享库

java - 如何将 MS Access 数据库连接到 Java Applet

java - 如何让多个类相互通信

javascript - javascript生成的CSS类不应用样式

css - 为什么输入类型=搜索会导致 Webkit(Safari)上的额外填充

css - 带有剪辑路径 : inset doesn't work in Safari 的动画

safari - Safari 6 或 Bootstrap 模式对话框出现渲染问题?