【问题标题】:java.security.AccessControlException: access denied using Java Web Startjava.security.AccessControlException:使用 Java Web Start 拒绝访问
【发布时间】:2011-01-17 15:51:09
【问题描述】:

我在使用 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)

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

想法?

【问题讨论】:

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


    【解决方案1】:

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

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


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

    【讨论】:

    • 我已经上传到服务器了。
    • 同一台服务器?还是另一种?此外,如果您还没有这样做,请从您的代码中删除所有提及 File 的内容。
    【解决方案2】:
    【解决方案3】:

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

    你有两个选择:

    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"));
      

    也就是说,无论如何,在 java.io 的东西中使用相对路径而不是绝对路径是一个坏主意。永远不要这样做。它将取决于您无法控制的当前工作目录。

    【讨论】:

      【解决方案4】:

      面临类似问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 2011-09-04
        • 2013-10-25
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多