java.security.AccessControlException:使用Java Web Start拒绝访问

时间:2010-02-17 00:24:47

标签: java security reflection java-web-start jnlp

我在使用JWS(Java Web Start)访问文件时遇到了一些问题。该程序添加了新标签和图像。程序在我的本地计算机上运行正常,但是当我使用JWS在远程服务器上运行程序时,会给出错误页面。以下是错误示例:

Exception in thread "AWT-EventQueue-0" java.security.AccessControlException: access denied (java.io.FilePermission add2.png read)
 at java.security.AccessControlContext.checkPermission(Unknown Source)
 at java.security.AccessController.checkPermission(Unknown Source)
 at java.lang.SecurityManager.checkPermission(Unknown Source)

即使确保图像具有读取权限,也会发生这种情况。

想法?

4 个答案:

答案 0 :(得分:4)

与applet一样,JNLP(webstart)在客户端计算机上运行,​​而不是在服务器计算机上运行。客户端从网页下载程序并在本地计算机上运行它。 java.io内容中的任何引用都将指向本地磁盘文件系统(代码运行的位置),而不是远程磁盘文件系统(从中下载代码的位置),正如您所期望的那样。

您有两个选择:

  1. 将图片打包到JAR中,然后使用ClassLoader#getResourceAsStream()从中获取InputStream

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    BufferedImage image = ImageIO.read(classLoader.getResourceAsStream("add2.png"));
    
  2. 将图像放在网络服务器的公共位置,以便您可以通过URL访问它(比在类路径中慢一点)。

    BufferedImage image = ImageIO.read(new URL("http://example.com/add2.png"));
    
  3. 也就是说,无论如何,在java.io中使用相对路径而不是绝对路径是一个坏主意。永远不要这样做。它将取决于您无法控制的当前工作目录。

答案 1 :(得分:2)

add2.png在哪里?如果它在您的本地文件系统上(而不是具有.jnlp文件的服务器),则不允许这样做,以保护用户的隐私。此外,也不允许从其他Web服务器获取资源。

请记住,JWS和applet代码通常是不可信的(除非它已经过数字签名,并且被用户接受)。因此,应用于它们的默认权限必须相当严格。


编辑添加:似乎从堆栈跟踪中,您的程序仍在尝试读取本地文件,而不是使用远程服务器的URL。确保您的代码没有引用java.io.File;这将有助于您查明任何有问题的代码区域。

答案 2 :(得分:0)

答案 3 :(得分:0)

面临类似的问题。

通过从控制面板中删除临时Internet文件解决 - >爪哇