我有一个applet类,它试图在客户机系统中读取一个文件。但是当访问这个文件时,我会得到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中没有帮助。
提前感谢您的帮助!
发布于 2015-05-16 08:35:59
经过大量的研究,找到了解决办法。
从applet调用的方法必须包围在AccessController.doPrivileged块中。
例如:
public void methForApplet(){
AccessController
.doPrivileged(new PrivilegedExceptionAction<Object>() {
public Object run() {
actualMethToBeExecuted();
return null;
}
});
}这在没有策略文件的java1.8和1.6中起作用。
https://stackoverflow.com/questions/30242060
复制相似问题