我制作了一个将高分保存在文件中的java游戏,但是我无法为程序提供足够的权限,使其能够在appletviewer下工作。
似乎appletviewer忽略了我的策略文件。
我将Game.java
编译为Game.class
,Game.html
加载并运行applet。在与这些目录相同的目录中,我有一个名为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)
此外,如果我在只包含上面的单行appletviewer命令的shell脚本上双击Finder,那么它甚至没有读取权限:
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会忽略我的策略文件?
答案 0 :(得分:3)
使用
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。
答案 1 :(得分:0)
我在使用Java SE7的mac OS10.8.4上尝试了以上所有内容。 Firefox和Safari。 没有任何效果。
我试图打开一个内部html文件,调用一个打开文件的jar文件。
Safari甚至没有启动java,在Firefox中无法打开嵌套文件(消息是找不到它,但我的猜测是浏览器不允许Java打开它)
我在终端中使用了appletviewer,而且所有文件都打开了。
这些是我用Mathematica和JavaLive3D编写的交互式机制的非常复杂的文件(大约12 MB代码),我想我再也看不到它了.... MacPro需要20分钟才能完成开。