我有一个签名的小程序,它在 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/