java - Applet 中的类加载器 : Can't access files

标签 java security applet classloader sandbox

我有一个应用程序,它使用反射来实例化保存在某个目录中的代码:我创建一个 URLClassLoader,然后使用提供的 URL 加载类;这很好用。我尝试将应用程序移植到Applet。为了加载文本文件和图像,我将代码从使用相对路径更改为使用 getResourceAsStream() ,效果很好。然而,对于类加载器,我仍然有一个 I/O 异常(在我更改代码以使用流之前,我也用它来获取文本文件和图像):

java.security.AccessControlException: access denied (java.io.FilePermission /.../... read)

要加载的类包含在 jar 文件中(所有其他资源也是如此)。有没有什么方法可以使用诸如 getResourceAsStream() 之类的方法来加载类,并且不会调用安全异常?请注意:我说的是从 java 代码中调用的类加载器,而不是加载 applet 的类加载器。

编辑:有关文件/文件夹结构的更多详细信息:

我的小程序位于包a,a.MyApplet中,它使用类a.aa.Loader,该类旨在加载存储在另一个文件夹b中的类(因此在加载小程序时不会加载)。文件夹b包含许多目录b.c_i,其中c_i是唯一的目录。每个目录中都有属于包 x.y.z 的类,因此 b 的整体文件夹结构为 b.c_i.x.y.z; z 包含要加载的文件。当我创建 jar 时,顶层看起来如下([] 表示文件夹): [a],[b],[data],[images] 其中 [a]={MyApplet,[aa],[aaa],etc.} 和 [b]={c_1,_c2,...} 其中 c_i={[x]}, [x]={[y]}, [y]={[z]} 和最后 [z]={Class.class}。希望这个符号不会太奇怪。

编辑2:更多详细信息。

澄清一下:我想要加载的类是其他人的类,全部放在单独的目录“DIR”中(它们不是项目的一部分,也不构成项目本身)。事实上,所有这些类名都是相同的,它们存储在“DIR”内的唯一目录中。我需要一次加载一个文件。换句话说,我想像对待任何其他资源一样对待类文件。

注意:我尝试了一个签名的小程序,它不再抛出安全异常,而是抛出 IO 异常:它无法找到该文件。我检查了目录结构并尝试了多种变体,所有变体都具有相同的结果(它在我的本地计算机上运行)。我不确定这是否真的是一个IO问题或者是否仍然是一个安全问题。

最佳答案

实际上,将项目保留为单独的对象范围是一个不好的基调,所以...

  • 您可以将所有项目打包到一个 jar 文件中。

  • 如果您将类(class)保留在服务器上只是因为整个 项目太大,您可以使用 pack200 util 压缩它,即 对于 Java Web Start 胖客户端小程序非常有帮助

  • 我确实建议使用 jnlp applet 启动类型,因为它提供了 更多选项 DeployJava.js

附注

如果您确实坚持使用类加载器加载资源,请以小程序标准方式进行,我的意思是使用 Anchor 对象

例如创建类似的结构

  • |- 包图片 -
  • |imageA.png
  • |imageB.png
  • |Anchor.class
  • |SourceBound.class
<小时/>

SourceBound.java

public class SourceBound
{

  /**
    Conception only...
  **/
  public SourceBound(){}

  public ImageIcon getImageA()
  {
    ImageIcon icon;
    Image image;

    image=ImageIO.read(Anchor.class.getResourceAsStream("imageA.png"));
    icon=new ImageIcon(image);

    return icon;
  }
}
<小时/>
  • |打包测试
  • |测试.class
<小时/>

测试.java

public class Test
{

SourceBound sourceBound=new SourceBound();

Test()
{
  JButton button=new JButton();
  button.setIcon(sourceBound.getImageA());

}

}

祝你好运

关于java - Applet 中的类加载器 : Can't access files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7484321/

相关文章:

java - Java 小程序部署工具包 : how to avoid the redirect when no JVM is installed

java - Jtextarea 中的阿姆哈拉语显示

android - 防止共享我的应用程序的安全性

javascript - 如何安全地将 Rails 模型属性传递给 JavaScript?

security - 使用 Node.js 的 Kerberos 身份验证

java - 在 Applet 中动态地将字符串从非主线程更新为主线程

Java代码小程序错误: java. security.AccessControlException:访问被拒绝("java.io.FilePermission" "MyFile.txt" "read")

java - 使用struts2-json-plugin时如何获取Struts2中的请求体

java swing DatePicker 使用 JTextField 做错了并且想要更改

java - 打开zip文件或JAR list 丢失时出错