1

我制作了一个将高分保存在文件中的 java 游戏,但我无法为程序提供足够的权限以使其在 appletviewer 下工作。

appletviewer 似乎忽略了我的策略文件。

我已经Game.java编译成Game.class,并Game.html加载和运行小程序。在与这些相同的目录中,我有一个以policy以下内容命名的策略文件(用 制作policytool)。

grant codeBase "file:///mypath/Game.html" {
  permission java.security.AllPermission;
};

然后appletviewer据说可以让您指定这样的策略文件:

appletviewer -J-Djava.security.policy=policy /mypath/Game.html

但是当我以这种方式启动游戏时,它只能读取高分文件,不能写入:

Exception in thread "Thread-5" java.security.AccessControlException:
                        access denied (java.io.FilePermission highscore write)

此外,如果我在 Finder 中双击仅包含上述单行 appletviewer 命令的 shell 脚本,则它甚至没有读取权限:

Exception in thread "Thread-5" java.security.AccessControlException:
                        access denied (java.io.FilePermission highscore read)

一个令人不安的迹象是,如果我给出一个不存在的文件的名称而不是我的策略文件的名称,那么我会得到相同的行为,而不会出现其他警告或错误:

appletviewer -J-Djava.security.policy=notafile /mypath/Game.html

游戏本身(除了高分代码)在每种情况下都能正常工作,如果我在 Eclipse 下运行整个游戏,即使 Eclipse 也使用 appletviewer 运行它,高分代码也能正常工作。Eclipse 还制作了一个与上述类似的策略文件,我也从命令行尝试过,但它仍然无法从命令行运行。

似乎appletviewer没有查看策略文件,尽管我使用的命令与http://docs.oracle.com/javase/tutorial/security/tour1/step3.html等各种教程中显示的完全一致。

为什么 appletviewer 会忽略我的策略文件?

4

2 回答 2

4

通过使用

grant codeBase "file:///mypath/Game.html" {
   permission java.security.AllPermission;
};

您实际上并未授予对类文件中代码的任何其他权限。

您可以尝试这样做:

grant codeBase "file:///mypath/-" {
   permission java.security.AllPermission;
};

这将授予AllPermission/mypath 及其子文件夹中的所有类和 jar 文件。该-字符表示此权限适用于该文件夹中的所有类/jar 文件,并递归地适用于所有子文件夹。如果您只想要一个文件夹,则可以使用*

关于如何指定codeBase参数的完整参考在这里:http ://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html#FileSyntax 。

于 2012-01-08T14:21:42.433 回答
0

我在带有 Java SE7 的 mac OS10.8.4 上尝试了上述所有方法。火狐和 Safari。没有任何效果。

我试图打开一个内部 html 文件,该文件调用一个正在打开文件的 jar 文件。

Safari 甚至没有启动 java,并且在 Firefox 中无法打开嵌套文件(消息是找不到,但我猜是浏览器不允许 Java 打开它)

我在终端中使用了appletviewer,令人惊讶的是所有文件都打开了。

这些是我用 Mathematica 和 JavaLive3D 编写的交互式机制的非常复杂的文件(大约 12 MB 代码),我以为我再也看不到它们了……在 MacPro 上打开需要 20 分钟。

于 2013-10-09T05:34:00.013 回答