我有一个小程序类,试图在客户端系统中读取文件。但是当访问这个文件时,我得到了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中没有帮助。
提前感谢您的帮助!
答案 0 :(得分:0)
从applet调用的方法必须包含在AccessController.doPrivileged块中。
例如:
public void methForApplet(){
AccessController
.doPrivileged(new PrivilegedExceptionAction<Object>() {
public Object run() {
actualMethToBeExecuted();
return null;
}
});
}
这适用于没有策略文件的java 1.8和1.6。