如何在Applet中模拟模式对话框?

时间:2009-04-29 20:03:28

标签: java applet opera securitymanager

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

这在大多数浏览器中都很有用。但是,在Opera和Safari for Windows中,我遇到了以下大问题:

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 个答案:

答案 0 :(得分:1)

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

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

你可能应该从美国东部时间拨打isVisible

模态界面通常很讨厌。

模态对话框出了什么问题?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您是否需要在applet上签名才能使用?

签署小程序

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

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

可以在此处找到有关applet安全模型的更全面的解释。这包括applet限制的完整列表。

有关applet签名的介绍和更多信息的链接,请阅读此内容,尤其是此内容。 Internet Explorer(和MS JVM)有点不标准;阅读本文,了解如何做的概述。

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

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

JavaDoc:java.security.AccessController

政策文件

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

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

以下示例显示了如何撤消大多数applet限制。可以使任何权限更具体,例如, FilePermission只能用于选定的文件,并且具有只读访问权限。每个Permission类的javadoc详细解释了什么是可能的。优良作法是尽可能使用最受限制的设置。特别是RuntimePermission可用于创建ClassLoaders和SecurityManagers,它可以规避更多的applet限制。

 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