签名applet加载签名的jar读取文件错误

时间:2013-03-14 23:13:53

标签: java security digital-signature jar-signing

我正在开发一款游戏,并制作了一个可以从user.home目录加载游戏的JFrame加载器,但最近我决定将它放在一个web applet中。

当我运行JFrame加载程序时,它成功加载游戏,检查文件并打开。 (游戏和JFrame都签了) 我可以使用以下方法从Applet中加载和调用该方法:

m.invoke(null, (Object) new String[]{textPack, font, currVersionStr,saveDir}, null, null, this);

但是当Applet尝试加载它时会发生以下错误,它设法加载游戏,但是当它尝试使用代码加载保存的选项时:

 File f = new File(OS.saveDir + OS.fileSeparator + "Options.keys");
    if (!f.exists()) {
        try {
            f.createNewFile();
            saveKeys();
        } catch (IOException ex) {
            Logger.getLogger(Configuration.class.getName()).log(Level.SEVERE, null, ex);
        }

它给了我以下错误:

  

2013年3月14日11:10:21 PM core.GameEngine运行SEVERE:null java.security.AccessControlException:访问被拒绝   (“java.io.FilePermission”“C:\ Users \ Jake.Zombies \ Options.keys”   “read”)在java.security.AccessControlContext.checkPermission(未知   来自java.security.AccessController.checkPermission(未知   来自java.lang.SecurityManager.checkPermission(未知来源)     在java.lang.SecurityManager.checkRead(未知来源)at   java.io.File.exists(未知来源)at   core.Configuration.loadKeys(Configuration.java:123)at   core.Configuration.onStartup(Configuration.java:105)at   core.GameEngine.run(GameEngine.java:76)

使用if(!f.exists())作为Configuration.java:123

我的问题是它在JFrame加载器(签名)中加载得很好但不是Applet(已签名)

非常感谢任何帮助,谢谢。

编辑:小程序加载程序检查文件,并可以下载最新的文件。只有当我然后问我加载的游戏时,加载文件才遇到问题。

编辑2(完整加载代码):

 File folder = new File(saveDir);
        URL u = new URL("jar:" + folder.toURI().toURL() + "Zombies.jar!/");
        URLClassLoader ucl = URLClassLoader.newInstance(new URL[]{u});
        Class c = Class.forName("Visual.GameDisplay", true, ucl);
        Method m = c.getMethod("main", String[].class, String[].class, java.sql.Connection.class, Component.class);
        m.invoke(null, (Object) new String[]{textPack, font, currVersionStr,saveDir}, null, null, this);

通过获取缓冲的输入流进行写入,然后将其写入bufferedoutputstream。

3 个答案:

答案 0 :(得分:2)

http://docs.oracle.com/javase/tutorial/deployment/applet/security.html

小程序不允许任意文件访问。

实际上,如果从本地磁盘加载,则会出现异常。怎么加载?

答案 1 :(得分:1)

小程序不允许访问用户文件系统。您必须将数据保存回服务器。

答案 2 :(得分:0)

将受信任和不受信任的代码混合起来是一个真正的想法。你可以加载任何东西。加载代码的更安全的方法是通过javax.jnlp,自6u10以来应该可用于applet。注意,你应该确保在加载jar之前你没有引用任何类,因为你不能使用那些类名(它不会起诉单独的类加载器)。