【发布时间】:2012-02-28 22:28:50
【问题描述】:
我正在开发一个帮助小程序来管理大文件的传输。我们目前有一个小程序来管理整个事务,从选择包含文件的文件夹,传输它们,并报告操作的成功和失败,但它在许多方面都非常不令人满意。所以现在我们只需要来自小程序的非常微妙的帮助,让用户在他们的本地机器上找到一个文件夹并管理传输。我们希望尽可能多的反馈和用户交互来使用基于 Web 的控件。所以你可以想象,这需要在浏览器中相当广泛地使用小程序和 Javascript 之间的桥梁。
在大多数情况下,这相当简单,但我发现了一个奇怪的边缘情况。我有一个弹出 JFileChooser 对话框并查看该文件夹的内容并将其报告回来的方法。当我在 start() 方法中创建一个 JButton 并使用它来弹出 JFileChooser 时,我有这个工作。但是我将 JFileChooser 的所有代码都放入了一个名为 showFolderSelect() 的方法中,这样我也可以尝试从 Javascript 打开 JFileChooser。所以这个来自小程序的调用是有效的:
public void actionPerformed(ActionEvent event) {
if ("browse".equals(event.getActionCommand())) {
showFolderSelect();
}
}
但是来自 Javascript 的这个调用没有:
function selectFolder() {
var infoApplet = document.getElementById('infoApplet');
infoApplet.showFolderSelect();
}
Javascript 调用让我在 Opera 的控制台中收到以下消息:
[5 October, 2003 6:26:56 AM] JavaScript - http://localhost:8080/applet-webapp/
Event thread: click
Uncaught exception: Error: java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
Error thrown at line 20, column 12 in selectFolder() in http://localhost:8080/applet-webapp/:
infoApplet.showFolderSelect();
called from line 1, column 0 in <anonymous function>(event) in http://localhost:8080/applet-webapp/:
selectFolder();
关于如何通过 Javascript 使其工作的任何想法?还是我只需要使用在小程序的 start() 方法中创建的 JButton?
请注意,我不能指望用户能够随意使用 java.policy 配置或类似的东西。我们可以期待的对安全性和访问控制的唯一认可是小程序经过数字签名。
感谢您对此问题的任何帮助或见解。
【问题讨论】:
-
请参阅this answer 回复。
AccessController/doPrivileged().
标签: java security swing applet