2

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

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

我可以使用 JRE 1.6 访问该文件。但是当小程序使用 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 版中没有帮助。

在此先感谢您的帮助!

4

1 回答 1

0

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

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

前任:

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

这在没有策略文件的 java 1.8 和 1.6 中有效。

于 2015-05-16T08:35:59.850 回答