4

在 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)

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

4

4 回答 4

1

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

于 2009-05-07T16:10:04.270 回答
1

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

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

您可能应该isVisible取消 EDT。

模态界面通常很讨厌。

模态对话框有什么问题?

于 2009-04-29T20:59:22.443 回答
1

如果我可以提供一种可行的不同方法,而不是拦截事件线程中的事件,您可以使用玻璃窗格来阻止所有输入请求

于 2009-05-07T12:09:48.827 回答
1

你不需要签署你的小程序才能让它工作吗?

签署小程序

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

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

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

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

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

AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // 这里执行安全敏感操作 return null; } });

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";
 };

Javadocs

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

于 2009-05-12T14:37:00.220 回答