我在使用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)
即使确保图像具有读取权限,也会发生这种情况。
想法?
答案 0 :(得分:4)
与applet一样,JNLP(webstart)在客户端计算机上运行,而不是在服务器计算机上运行。客户端从网页下载程序并在本地计算机上运行它。 java.io
内容中的任何引用都将指向本地磁盘文件系统(代码运行的位置),而不是远程磁盘文件系统(从中下载代码的位置),正如您所期望的那样。
您有两个选择:
将图片打包到JAR中,然后使用ClassLoader#getResourceAsStream()
从中获取InputStream
。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
BufferedImage image = ImageIO.read(classLoader.getResourceAsStream("add2.png"));
将图像放在网络服务器的公共位置,以便您可以通过URL访问它(比在类路径中慢一点)。
BufferedImage image = ImageIO.read(new URL("http://example.com/add2.png"));
也就是说,无论如何,在java.io中使用相对路径而不是绝对路径是一个坏主意。永远不要这样做。它将取决于您无法控制的当前工作目录。
答案 1 :(得分:2)
add2.png
在哪里?如果它在您的本地文件系统上(而不是具有.jnlp
文件的服务器),则不允许这样做,以保护用户的隐私。此外,也不允许从其他Web服务器获取资源。
请记住,JWS和applet代码通常是不可信的(除非它已经过数字签名,并且被用户接受)。因此,应用于它们的默认权限必须相当严格。
编辑添加:似乎从堆栈跟踪中,您的程序仍在尝试读取本地文件,而不是使用远程服务器的URL。确保您的代码没有引用java.io.File
;这将有助于您查明任何有问题的代码区域。
答案 2 :(得分:0)
您的JAR必须签名。阅读本教程:
http://www.mobilefish.com/tutorials/java/java_quickguide_keytool.html
http://www-personal.umich.edu/~lsiden/tutorials/signed-applet/signed-applet.html
http://faq.javaranch.com/java/HowCanAnAppletReadFilesOnTheLocalFileSystem
答案 3 :(得分:0)
面临类似的问题。
通过从控制面板中删除临时Internet文件解决 - >爪哇