JNLP 不合作 JFileChooser 访问被拒绝

Posted

技术标签:

【中文标题】JNLP 不合作 JFileChooser 访问被拒绝【英文标题】:JNLP isn't cooperating JFileChooser Access Denied 【发布时间】:2010-10-07 02:28:14 【问题描述】:

我觉得自己很笨……

所以我正在编写一个 Java 应用程序,如果你能帮助我让它工作,你将能够看到它。

所以我的 jar 文件在这里:http://team2648.com/OTIS2/admin/OmniNode2.8.jar

我希望它能够用作 Java 网络启动应用程序,我正在按照这里的教程进行操作:http://download.oracle.com/javase/tutorial/deployment/webstart/deploying.html

所以我按照指示编写了以下 JNLP 文件:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" 
codebase="http://team2648.com/OTIS2/admin" 
href="test.jnlp">
<information>
    <title>OmniNode Mapper</title>
    <vendor>Techplex Engineer</vendor>
</information>
<resources>
    <!-- Application Resources -->
    <j2se version="1.6+"
      href="http://java.sun.com/products/autodl/j2se"/>
    <jar href="OmniNode2.8.jar" main="true" />

</resources>
<application-desc
     name="OmniNode Mapper"
     main-class="omninode28.Driver"
     
     >
 </application-desc>
 <update check="background"/>
</jnlp>

但是你会看到如果你下载 jnlp http://team2648.com/OTIS2/admin/test.jnlp 并运行它,我们得到以下错误(在 PC 上):

access denied (java.io.FilePermission C:\Users\MyUserName\Documents read)

例外

java.security.AccessControlException:访问被拒绝(java.io.FilePermission C:\Users\Techplex Engineer\Documents 读取) 在 java.security.AccessControlContext.checkPermission(未知来源) 在 java.security.AccessController.checkPermission(未知来源) 在 java.lang.SecurityManager.checkPermission(未知来源) 在 java.lang.SecurityManager.checkRead(未知来源) 在 java.io.File.exists(未知来源) 在 java.io.Win32FileSystem.canonicalize(未知来源) 在 java.io.File.getCanonicalPath(未知来源) 在 sun.awt.shell.Win32ShellFolderManager2.createShellFolder(未知来源) 在 sun.awt.shell.Win32ShellFolderManager2.getPersonal(未知来源) 在 sun.awt.shell.Win32ShellFolderManager2.get(未知来源) 在 sun.awt.shell.ShellFolder.get(未知来源) 在 javax.swing.filechooser.FileSystemView.getDefaultDirectory(未知来源) 在 javax.swing.JFileChooser.setCurrentDirectory(未知来源) 在 javax.swing.JFileChooser.(未知来源) 在 javax.swing.JFileChooser.(Unknown Source)在 omninode28.NodePanel.(NodePanel.java:61)在 omninode28.EditPanel.(EditPanel.java:31 )在 omninode28.Driver.main(Driver.java:25) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 com.sun.javaws.Launcher.executeApplication(未知来源) 在 com.sun.javaws.Launcher.executeMainClass(未知来源) 在 com.sun.javaws.Launcher.doLaunchApp(未知来源) 在 com.sun.javaws.Launcher.run(未知来源) 在 java.lang.Thread.run(Unknown Source)

所以它指向的那些文件:

这一行:fc = new JFileChooser();

所以这让我相信我需要询问用户是否允许写入他们的系统。

我很困惑。 任何帮助都会很棒, 谢谢

编辑... 我应该让用户直接下载 Jar 吗? 利弊?

【问题讨论】:

【参考方案1】:

您必须通过将此 sn-p 添加到 jnlp 中来签署 jar 并授予对类的权限:

<security>
  <all-permissions/>
</security>

【讨论】:

【参考方案2】:

显然,如果您浏览过的任何网站都能够从本地文件系统中读取数据,这将是一个坏主意。所以不能直接使用。

也许最好的解决方法是使用FileOpenService。这为应用程序提供了一个简单的接口,可以访问具有某种描述的文件选择器,该文件选择器可以打开(读取,不幸的是,写入)用户选择的文件,而无需直接访问文件系统。

【讨论】:

FileOpenService 只允许应用程序读取文件。是 FileSaveService 迎合写作。这是 FOS/FSS 和 FileContents 对象的演示。 pscode.org/jws/api.html#fs @Andrew Thompson FileOpenService 还允许修改选定的文件。在文件选择器之前有一个(毫无意义的)安全警告对话框,它曾经说只是读取。显示程序员对安全警告的重视程度。 很遗憾,“打开”安全提示已更改,因为它现在非常不准确。接受提示,即使选中了“始终允许”,当用户去保存文件时仍然会产生提示。或者至少,这是我目前在 PSCode 演示中看到的行为。你能提供不同的代码或演示吗?【参考方案3】:

一种可能性是,您的 jar 没有像 here 提到的那样签名

【讨论】:

以上是关于JNLP 不合作 JFileChooser 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

JNLP文件

为 JNLP 配置权限:

Jenkins Slave JNLP 连接被终止

JFileChooser保存对话框建议文件名[重复]

如何签名JNLP文件?

取消在 JFileChooser 中选择文件而不关闭对话框