首页 文章

如何让applet读取客户端上的任何文件? (创建一个上传者)

提问于
浏览
0

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

如果我加

<param name="permissions" value="all-permissions" />

到applet标签,它抛出

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上传器applet实现吗?当然,该软件的部署版本将使用可信证书进行签名,但我需要一种方法来测试它....

谢谢!

更新

以下是需要做的事情:

鉴于我们开发的Web应用程序,该应用程序需要来自本地文件系统的大量小文件 . 因此,我们需要遍历目录结构并检查文件,以便找到Web应用程序所需的文件 . 这非常麻烦,因此我们需要自动化 .

我想到了另外两种方法:

但是,

  • JNLP-applet,其API只能为单个或多个文件显示FileChooser,但不能为目录显示

  • 一个普通的旧Java客户端应用程序,它将找到它需要的文件并通过API将它们上传到服务器 . 然后可以通过Java Web Start启动此客户端 .

  • ..你还有什么想法吗?

3 回答

  • 0

    您正在尝试做的事情通常是不满意的,因为这正是系统在安装Java时受到危害的方式 . 您要执行的操作具有特权,您需要以特权模式运行代码,并且很可能创建一个策略文件以允许它在客户端计算机上运行 . 有关http://www.coderanch.com/how-to/java/HowCanAnAppletReadFilesOnTheLocalFileSystem的简短教程 .

    现在,拜托,这实际上是一个非常糟糕的想法 . 您是否有可能宁愿编写一个JavaScript页面,通过某些API调用来执行此上传?这样,您就不会绕过浏览器安全性来执行上传 .

    Java Applet方法是一个过时的,危险的和非常糟糕的讨厌的解决方案,没有任何签名,策略文件或调整将使这成为一个安全的替代方案 . 我是一个巨大的Java粉丝,但是如果有一件事让我做噩梦,那就是Java浏览器插件 - 使用它并不是一个好理由,而不是当你考虑它是多么不安全时 . 当然,不要让我开始使用Flash ...

    您使用通过Web Start加载的普通Java客户端的想法似乎是最佳解决方案 . 这样,一旦安装,您的应用程序就可以完全访问底层文件系统 . 当然,这也开启了关于这是否真的是首先使用Java的情况的争论,但这是另一个鱼的水壶 .

  • 1

    要做到这一点,你必须签署您的小程序 .

    keytool -genkey -keystore myKeyStore -alias me

    keytool -selfcert -keystore myKeyStore -alias me

    jarsigner -keystore myKeyStore jarfile.jar我

  • 1

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

    • 从本地文件系统加载的applet的安全环境似乎比从 localhost 加载的更安全 . 有关详细信息,请参见this answer .

    我同意您的评估,即基于JNLP的文件选择器不适合此任务 . 正如您所提到的,它是用于处理文件资源,而不是目录 . 更糟糕的是,我注意到我使用基于JNLP的文件打开服务开发的小applet在浏览时抛出 NullPointerException ,在选择器本身中具有相关的奇怪视觉行为 . 完全不足 .

    作为applet问题的顶级海报,我强烈警告不要在网页中嵌入上传器 . 最大的问题:

    • 它会导致浏览器/ JRE / JavaScript / applet交互错误的进一步问题

    • 它创建了一个不可调整大小的GUI . 有很多方法可以创建resizable applet,但是上次我检查过,它们在浏览器中并不可靠 .

    所以最后,我建议使用完全信任(即 all-permissions )的应用程序 . 使用Swing JFileChooser 或从自由浮动开启的File Browser GUI的变体,JNLP启动了 JFrame . 如果用例足够简单,我们甚至可以省去框架本身,并(直观地)直接进入文件选择器 .

    The 'free-floating' approach will not work in a web-app. that requires JavaScript interaction. 如果是网络应用程序 . 需要的是,我们回到'applet',这就是你想要使用评论中提到的 doPrivileged(..) 功能的地方 . 原因是如果一个方法是由JS以编程方式调用的,那么基于Java的安全管理器会检测到堆栈中的某些帧不受信任(JS),因此即使Java代码最初是受信任的,也会将所有内容放回沙箱中 .

相关问题