【问题标题】:How do I simulate a modal dialog from within an Applet?如何从 Applet 中模拟模式对话框?
【发布时间】:2010-10-22 16:28:45
【问题描述】:

在 setVisible(true) 上,我调用下面的代码来启动一个模态对话框:

private synchronized void startModal () {
  try {
    if (SwingUtilities.isEventDispatchThread()) {
      EventQueue theQueue = getToolkit().getSystemEventQueue();
      while (isVisible()) {
        AWTEvent event = theQueue.getNextEvent();
        Object source = event.getSource();
        if (event instanceof ActiveEvent) {
          ((ActiveEvent) event).dispatch();
        } else if (source instanceof Component) {
          ((Component) source).dispatchEvent(event);
        } else if (source instanceof MenuComponent) {
          ((MenuComponent) source).dispatchEvent(event);
        } else {
          System.err.println("Unable to dispatch: " + event);
        }
      }
    } else {
      while (isVisible()) {
        wait();
      }
    }
  } catch (InterruptedException ignored) { }
}

这在大多数浏览器中都非常有效。然而,在 Windows 的 Opera 和 Safari 中,我遇到了以下严重的异常:

java.security.AccessControlException: access denied (java.awt.AWTPermission accessEventQueue)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkAwtEventQueueAccess(Unknown Source)
    at java.awt.Toolkit.getSystemEventQueue(Unknown Source)

是否有在这些浏览器中生成假模态对话框的解决方法?

【问题讨论】:

    标签: java applet opera securitymanager


    【解决方案1】:

    除非你有一个奇怪的实现,否则应该授予该权限(Sun PlugIn 自 1.2.2,IIRC 以来一直授予它)。我们在谈论哪些版本?

    这可能不是最好的调度循环。

    您可能应该在 EDT 外致电 isVisible

    模态界面通常很讨厌。

    模态对话框有什么问题?

    【讨论】:

    • 它的 Java 1.6u13(以及其他)。但是,作为状态,它在 Windows 浏览器上的 Opera 和 Safari 中,它们都有自己的 Java 插件。
    • 模态对话框不起作用,因为这些不是真正的对话框。他们只需要阻止调用代码(在 EDT 上),直到对话框关闭。我们可以用不同的方法重写它,但更愿意坚持使用模态方法,而不是为两个奇怪的浏览器重写。
    • IIRC,Opera 使用 ye olde "Firefox 2" 插件,它的行为应该与此相同。他们真的应该继续使用新的 Firefox 3/Chrome 插件界面。您可以在屏幕外打开没有装饰的对话框。这就是 WebStart 和 PlugIn 安全对话框所做的(尽管 IIRC,它们留下了装饰,这不是那么明亮)。
    • 实际上,Opera 有自己的非 Sun 插件。显然,控制台和 sec 管理器不同。这些根本不是真正的对话框(JInternalframes,出于可用性原因被奇怪地使用)。除了这两个浏览器之外,它们在所有浏览器上都运行良好。
    【解决方案2】:

    如果我可以提供一种可行的不同方法,而不是拦截事件线程中的事件,you could use the glass pane to block all input requests

    【讨论】:

    • 是的,我应该在原始问题中提到这一点。它“有效”,但是当放置在玻璃板上时,会在摆动控件中暴露出大量难以解决的错误。它也没有完全解决模态问题(它不仅隐藏事件,还导致 setVisible(true) 挂起调用者直到对话框被隐藏)。
    【解决方案3】:

    您不需要为您的小程序签名以使其工作吗?

    签署小程序

    让小程序完成所有这些事情的方法是对其进行数字签名。实际上,签名者说“这个小程序可以安全使用,如果你信任我,你就可以信任这个小程序,因为通过我的签名,你可以确保它在我签名后没有被篡改过。”然后将询问用户她是否要信任签名者(通常在一个小对话框中),如果她愿意,则小程序可以以完全权限继续。如果信任被拒绝,小程序将继续在沙箱内以有限的权限运行。

    应该非常明智地决定是否信任小程序,因为受信任的小程序具有与本地启动的应用程序相同的权限:它可以读取和删除文件,以及通过网络传输数据。

    可以在此处找到有关小程序安全模型的更详尽说明。这包括小程序限制的完整列表。

    有关小程序签名的介绍和更多信息的链接,请阅读此内容,尤其是此内容。 Internet Explorer(和 MS JVM)有点不标准;阅读此内容以了解该做什么的概述。

    如果即使在对小程序进行签名后,您仍然收到 SecurityException,请尝试将代码作为特权代码运行:

    AccessController.doPrivileged(new PrivilegedAction() { 公共对象运行(){ // 这里执行安全敏感操作 返回空值; } });

    JavaDoc:java.security.AccessController

    政策文件

    授予小程序附加功能的另一种方法是使用策略文件,Sun 有一篇介绍性文章,这里还有一篇专门针对小程序的文章。使用策略可以以更细粒度的方式控制授予小程序的权限。例如,可以授予小程序访问本地文件系统的权限,但不能授予它们被拒绝的任何其他功能。这是一个例子。

    使用策略文件的缺点是它们驻留在本地文件系统中,因此用户必须对通常不在他们视线范围内的文件进行更改,并且其内容不容易理解。

    以下示例显示了如何撤销大多数小程序限制。任何权限都可以变得更具体,例如只能为选定的文件提供 FilePermission,并且具有只读访问权限。每个 Permission 类的 javadocs 详细解释了可能的情况。最好使用最受限制的设置。特别是 RuntimePermission 可用于创建 ClassLoaders 和 SecurityManagers,它们可以规避更多的小程序限制。

     grant codeBase "http://geosim.cs.vt.edu/geosim/-" {
       permission java.io.FilePermission "<<ALL FILES>>", "read, write, execute, delete";
       permission java.net.SocketPermission "*", "accept, connect, listen, resolve";
       permission java.util.PropertyPermission "*", "read, write";
       permission java.lang.RuntimePermission "*";
       permission java.awt.AWTPermission "showWindowWithoutWarningBanner";
     };
    

    Java 文档

    JavaDoc:java.awt.AWTPermission JavaDoc:java.io.FilePermission JavaDoc:java.lang.RuntimePermission JavaDoc:java.net.SocketPermission JavaDoc:java.util.PropertyPermission

    【讨论】:

      【解决方案4】:

      Opera 出现问题的原因可能是 Opera 有自己的名为 opera.policy 的 java.policy 文件(位于 Opera_installation_directory\classes 文件夹下)。但是,在我的 Opera 安装中,我看不到任何未在 Opera 中授予但在默认 java.policy 文件中授予的权限。

      【讨论】:

      • Sun PlugIn 和 WebStart 授予此权限。
      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      相关资源
      最近更新 更多