我已经整理了一个基本applet,用户从硬盘驱动器中选择一个文件,它会读取此文件的第一行并将其传递给JavaScript进行一些额外的预处理,然后当您单击一个按钮时它会尝试通过HTTP POST请求上传该文件。我发现了一个非常基本的开源applet,用于上传我为此最后一点复制和修改的文件。

然而,麻烦的是它并不常用。看起来它运行正常,但后来我遇到了两个与权限相关的障碍。 Java控制台中的消息表明applet在以下两个权限上具有访问被拒绝错误:

java.lang.RuntimePermission setFactory
java.io.FilePermission read

我发现这很奇怪,因为当我使用“自签名”构建它时,我认为我已经批准了applet。在NetBeans中选中选项,然后单击以确认浏览器中的小安全性弹出窗口。

此外,我自己编写的部分,它读取文件并将第一行传递给JavaScript的工作正常。这是一个非常明确的指示,表明applet能够从本地文件系统中读取!在我真正尝试开始上传之前,问题才会开始。我想有一点需要注意的是,上传过程似乎是在一个新线程中运行,而其余部分都在主类中运行而不创建线程。

我是Java的新手,对Java中的线程知之甚少;我需要以某种方式将权限传递给这个新线程吗?或者那种效果? 提前谢谢。

有帮助吗?

解决方案

您可能需要向安全管理员(代码,而不是管理员)询问是否允许执行特权操作。由于各种原因,applet能够打开本地文件通常不是一件好事,所以它的防范程度非常高。

基本的关键是调用 AccessController.doPrivileged(),并且有一个 Java Ranch常见问题解答中的好小教程

其他提示

我有一个类似的问题需要永远解决。事实证明,从JavaScript调用的applet方法没有权限,即使您在策略文件中明确授予它们。

这个解决方法对我有用(将命令添加到applet循环的队列中): http://blog.carrythezero.com/?p=5

确保您了解此处的危险:任何人都可以修改页面上的JavaScript并更改正在进入applet的内容。在我的情况下,我知道代码永远不会在Web服务器上运行,并且该类是未签名的,因此除非在我的策略文件授予的特定位置,否则它将失败。

这可能是因为JavaScript没有签名。我强烈建议您不要签署代码,特别是如果您不知道自己在做什么。从6u10开始(不在Mac上)applet可以使用JNLP,包括FileOpenService,因此您不必签名。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top