Java 如何让小程序读取客户端上的任何文件?(创建上载程序)

Java 如何让小程序读取客户端上的任何文件?(创建上载程序),java,security,permissions,applet,Java,Security,Permissions,Applet,我正在编写一个Java文件上传程序applet,但我无法解决以下问题。(上传器非常专业,因此我们不能只使用储备溶液)。我有一个自签名的小程序,我正在本地测试它,但是我无法让它读取本地文件。我有权限:清单中声明的所有权限 如果我加上 <param name="permissions" value="all-permissions" /> 如果我避免这个,它会抛出 com.sun.deploy.security.BlockedException:

我正在编写一个Java文件上传程序applet,但我无法解决以下问题。(上传器非常专业,因此我们不能只使用储备溶液)。我有一个自签名的小程序,我正在本地测试它,但是我无法让它读取本地文件。我有权限:清单中声明的所有权限

如果我加上

<param name="permissions" value="all-permissions" />
如果我避免这个,它会抛出

com.sun.deploy.security.BlockedException: User has denied the privileges to the code
java.security.AccessControlException: access denied ("java.io.FilePermission" PATH_TO_FILE" "read")
在第一种情况下会抛出BlockedException,即使当Java插件询问我有关安全问题时,我总是说“不要阻止”,以便运行此代码

你知道我如何测试这个吗?或者你能告诉我一个我可以检查的开源Java uploader小程序实现吗?当然,此软件的部署版本将使用可信证书进行签名,但我需要一种方法来测试它

谢谢大家!

更新 以下是需要做的事情:

给定我们开发的web应用程序,该应用程序需要来自本地文件系统的大量小文件。因此,我们需要迭代目录结构并检查文件,以便找到web应用程序需要的文件。手工操作非常麻烦,因此我们需要将其自动化

我想到了另外两种方法:

  • 然而,JNLP小程序的API只能显示单个或多个文件的文件选择器,而不能显示目录
  • 一个普通的旧Java客户端应用程序,它将找到它需要的文件,并通过API将它们上传到服务器。然后可以通过JavaWebStart启动该客户机
  • 你还有什么想法吗

  • 您试图做的事情通常是不受欢迎的,因为这正是安装了Java的系统受到损害的原因。您要执行的操作是特权操作,您需要以特权模式运行代码,并且很可能创建一个策略文件,以允许此操作在客户端计算机上运行。这里有一个简短的教程

    拜托,这其实是个很糟糕的主意。难道您根本就不可能编写一个JavaScript页面,通过一些API调用来执行此上传吗?这样,您就不会绕过浏览器安全性来执行上载

    javaapplet方法是一种过时、危险和令人讨厌的解决方案,任何签名、策略文件或调整都不会使它成为一种安全的替代方案。我是一个巨大的java迷,但是如果有一件事让我噩梦,那就是java浏览器插件——它从来就没有一个好的理由来使用它,而不是当你考虑它是多么不安全的时候。当然,不要让我开始使用Flash


    您使用通过WebStart加载的普通Java客户机的想法似乎是最好的解决方案。这样,一旦安装,应用程序就可以完全访问底层文件系统。当然,这也引发了一场争论,即这是否真的是一种首先使用Java的情况,但这完全是另一回事。

    要做到这一点,您必须对小程序进行签名

    keytool-genkey-keystoremykeystore-alias me

    keytool-selfcert-keystoremykeystore-alias me


    jarsigner-keystore myKeyStore jarfile.jar me

    在本地服务器1上运行的自签名小程序应该能够访问本地文件系统。可能需要降低Java控制面板中的安全级别。Oracle正在加强小程序的安全性,因此它将取决于加载小程序的确切JRE版本

  • 从本地文件系统加载的小程序的安全环境似乎比从
    localhost
    加载的小程序更为严格。有关详细信息,请参阅
  • 我同意您的评估,即基于JNLP的文件选择器不适合此任务。正如您提到的,它用于处理文件资源,而不是目录。更糟糕的是,我注意到我使用基于JNLP的文件开放服务开发的一个小applet在浏览时抛出了
    NullPointerException
    ,选择器本身也有相关的奇怪视觉行为。完全不够

    作为小程序问题的头条海报,我强烈警告不要在网页中嵌入上传程序。最大的问题是:

    • 它会在浏览器/JRE/JavaScript/applet交互错误方面产生进一步的问题
    • 它创建了一个不可调整大小的GUI。有很多方法可以创建一个浏览器,但上次我检查时,它们在不同浏览器中都不可靠
    因此,最后,我建议使用完全受信任(即
    all permissions
    )的应用程序。它使用Swing
    JFileChooser
    或从自由浮动JNLP启动的JFrame的变体。如果用例足够简单,我们甚至可以不用框架本身,直接(直观地)转到文件选择器


    在web应用程序中,“自由浮动”方法不起作用。这需要JavaScript交互。如果web应用程序。需要,我们回到“applet”,在这里您可以使用您在评论中提到的
    doPrivileged(…)
    功能。原因是,如果JS以编程方式调用某个方法,基于Java的安全管理器会检测到堆栈中的某些帧不受信任(JS),因此会将所有内容放回沙盒中,即使Java代码最初是受信任的。

    我今天更新了我的JRE,所以我使用的是最新版本,我把Java控制面板的安全级别调低到中等。谢谢你的回答。使用策略文件是一个坏主意,它需要出现在每个客户端的PC上。因为我不能在这里输入带换行符的长文本,我将用我想要实现的目标的细节更新问题。@Peter-谢谢你的澄清。正如我所说,这是一个非常糟糕的主意:)WebStart的想法似乎是最好的解决方案,它会给你所需要的自由和灵活性。而这个米格