【问题标题】:java.io.FilePermission read access denied when launching applet with java 8java.io.FilePermission 使用 java 8 启动小程序时读取访问被拒绝
【发布时间】:2015-07-26 08:21:54
【问题描述】:

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

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

我可以使用 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 版中没有帮助。

提前感谢您的帮助!

【问题讨论】:

  • “jar 已签名..” 这样就没有必要乱搞策略文件了!

标签: java security exception applet policyfiles


【解决方案1】:

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

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

例如:

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

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

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 2012-05-14
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多