我有一个签名的applet,它在PrivilegedAction中执行一些代码。
public String somePublicMethod()
{
String str = (String) AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
return someMethodThatReturnsAString();
}
});
return str;
}
这里的方法someMethodThatReturnsAString在超类中,该类在第三方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上看到类似的问题,谈到了从签名的applet抛出的AccessControlException。但这是不同的,因为抛出的异常是PrivilegedAccessException,并且applet按照这些问题的答案中的建议将代码作为特权操作执行。
我甚至尝试过使用PrivilegedExceptionAction,但这没有帮助。有没有人遇到过这个?
答案 0 :(得分:3)
我找到了解决方法。问题不在于applet,而是JavaScript中的代码,它操纵applet方法返回的字符串。该字符串被视为Java对象而不是JavaScript对象,这导致Safari出现问题。将Java字符串转换为JavaScript字符串解决了这个问题。
我无法在浏览器的错误控制台中获得完整的堆栈跟踪,因此我依赖于Java控制台日志。日志消息有点误导,因为它显示此错误源自applet。