【问题标题】:JFileChooser causes AccessControlException when invoked through JS, works when called through appletJFileChooser 通过 JS 调用时会导致 AccessControlException,通过 applet 调用时有效
【发布时间】: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


【解决方案1】:

我认为这说明了 Java 可以做什么,而 JavaScript 不能做什么。看起来 JavaScript 不允许调用允许访问客户端系统的方法。也许 JavaScript 对 Java 代码的访问仅限于未签名的小程序允许的范围。

如果这只是 Java - JavaScript 桥中的一个限制,我无法想象有任何解决方法。对我来说,它看起来就是这样。

如果您对小程序中的整体用户体验不满意,请考虑将其移至 JavaFX,而不是使用 JavaScript 的纯浏览器界面。

查看Java FX Ensemble gallery 了解您可以使用的 UI 组件列表。

【讨论】:

    【解决方案2】:

    在大多数现代 Web 浏览器上,JS 应用程序可能只打开文件对话框以响应用户操作。因此,您可以从 onclick 处理程序(显然包括 Java 小程序中的处理程序)创建打开文件对话框,但不能从例如加载处理程序。

    因此,您可能需要创建一个按钮或&lt;a href="#"/&gt; 供用户单击,然后在该事件处理程序中调用showFolderSelect()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多