使用java 8

时间:2015-05-14 16:09:50

标签: java security exception applet policyfiles

我有一个小程序类,试图在客户端系统中读取文件。但是当访问这个文件时,我得到了java.io.filePrmission错误

  

java.security.AccessControlException:访问被拒绝   (" java.io.FilePermission"" C:\ my_download \ mytext_11May"" read")

我可以使用JRE 1.6访问该文件。但是当applet使用jre1.8时,会抛出上述异常。

我在用户家位置的政策文件:

grant codeBase "file:${java.home}/lib/ext/*" {
  permission java.security.AllPermission;
};

grant {
  permission java.security.AllPermission;
};

grant codeBase "https://*.mydomain.net-" {
  permission java.security.AllPermission;
};

在1.6中,只有在默认授权块中给出AllPermission时才有效。

以下是我用来访问该文件的代码:

File sourceDir = null;
try {
    sourceDir = (File) AccessController
        .doPrivileged(new PrivilegedExceptionAction<File>() {
            public File run() {
                    return new File(filePath);
                }
            });
} catch (PrivilegedActionException e) {
    System.out.println(e.getMessage()+"-----");
    e.printStackTrace();
} catch(Exception e) {
    System.out.println("EEEException: " + e.getMessage());
    e.printStackTrace();
}

奇怪的是,catch块也没有被执行。它执行调用方法的catch块。

jar使用所有必需的域进行签名,权限如下所述。

Permissions: all-permissions

在我尝试写操作的同一个jar中,即使没有使用版本1.6和1.8的策略文件也能正常工作。我只有在尝试阅读它时才会收到此异常。在1.6中我通过使用java策略克服了,但这在版本1.8中没有帮助。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

经过大量研究,找到了解决方案。

从applet调用的方法必须包含在AccessController.doPrivileged块中。

例如:

public void methForApplet(){
   AccessController
        .doPrivileged(new PrivilegedExceptionAction<Object>() {
            public Object run() {
                    actualMethToBeExecuted();
                    return null;               
            }
    });
}

这适用于没有策略文件的java 1.8和1.6。