在同一代码库中具有applet类的AccessControlException

2020年4月9日 32点热度 0条评论

我有三个类,一个叫做Capture,AppletLogging和AbstractJLabel。我已经在我的%USERPROFILE%/。java.policy文件中设置了以下权限:

grant codeBase "file:/C:/project/abc/target/test-classes/-" {
  permission java.util.logging.LoggingPermission "control";
};

所有类都在上述授予的codeBase中。当Capture在AppletLogging中调用静态方法时,一切正常。当AbstractJLabel在AppletLogging中调用相同的静态方法时,我得到

java.security.AccessControlException: access denied (java.util.logging.LoggingPermission control)

它在Sun Java插件版本6更新35中运行。有人有解释吗?即使我对Grant codeBase块执行以下所有操作,我也会遇到相同的错误:

  permission java.security.AllPermission;

请注意,Capture和AbstractJLabel从静态块调用静态方法。

解决方案如下:

事实证明,我面临的问题是因为每当我获得AccessControlException时,就会从Javascript调用正在运行的线程。让我解释一下,在托管applet的页面上,我有一个applet标签的引用。可以通过引用applet标签的Javascript变量在Java applet类上调用公共实例方法。在那种情况下,即使线程正在从applet(或包含主applet类的jar)中运行代码,它也不会从applet代码库继承权限,因为该调用来自外部。解决方案是在AccessController.doPrivileged内部调用需要权限的Java代码。