繁体   English   中英

使用Java 8启动applet时拒绝java.io.FilePermission读取访问

[英]java.io.FilePermission read access denied when launching applet with java 8

我有一个试图读取客户端系统中文件的applet类。 但是访问此文件时,出现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版中无济于事。

先谢谢您的帮助!

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

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

例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM