如何在Applet中模拟模式对话框?
在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中,我遇到了以下令人讨厌的exception:
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)
是否有在这些浏览器中生成假modal dialog的解决方法?
除非你有一个奇怪的实现(Sun PlugIn自1.2.2,IIRC以来一直授予它),否则应该授予该权限。 我们在谈论哪些版本?
这可能不是最佳的调度循环。
你可能应该在EDT上打电话给isVisible
。
模态界面通常很讨厌。
modal dialog出了什么问题?
如果我可以提供一种可行的不同方法,而不是拦截事件线程中的事件,则可以使用玻璃窗格来阻止所有输入请求 。
您是否需要签署您的小程序才能使用?
签署applet
允许applet完成所有这些操作的方法是对其进行数字签名。 实际上,签名者说“这个applet可以安全使用,如果你相信我,你可以相信这个applet,因为通过我的签名,你可以放心,自从我签名以来它没有被篡改过。” 然后将询问用户是否想要信任签名者(通常在一个小对话框中),如果她这样做,则applet可以继续使用完全权限。 如果信任被拒绝,则applet将继续在具有有限权限的沙箱内运行。
是否应该非常谨慎地决定是否信任applet,因为受信任的applet具有本地启动的应用程序所具有的相同权限:它可以读取和删除文件,并通过网络传输数据。
可以在此处找到有关applet安全模型的更全面的解释。 这包括applet限制的完整列表。
有关applet签名的介绍和更多信息的链接,请阅读此内容,尤其是此内容。 Internet Explorer(和MS JVM)有点不标准; 阅读本文,了解如何做的概述。
如果,即使在签署applet之后,仍然会收到SecurityException,请尝试将代码作为特权代码运行:
AccessController.doPrivileged(new PrivilegedAction(){public Object run(){//执行安全敏感操作,返回null;}});
的JavaDoc:java.security.AccessController
政策文件
授予applet附加function的另一种方法是使用策略文件,Sun有一篇介绍性文章,另一篇专门针对applet。 使用策略可以以更细粒度的方式控制授予applet的权限。 例如,可以授予applet访问本地文件系统的权限,但不允许任何其他function被拒绝。 这是一个例子。
使用策略文件的缺点是它们驻留在本地文件系统上,因此用户必须对通常不在其视线范围内的文件进行更改,并且其内容并非易于理解。
以下示例显示如何撤消大多数applet限制。 可以使任何权限更具体,例如,可以仅为选定文件提供FilePermission,并且具有只读访问权限。 每个Permission类的javadoc详细解释了什么是可能的。 优良作法是尽可能使用最受限制的设置。 特别是RuntimePermission可用于创建ClassLoaders和SecurityManagers,它可以规避更多的applet限制。
grant codeBase "http://geosim.cs.vt.edu/geosim/-" { permission java.io.FilePermission "<>", "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"; };
的Javadoc
JavaDoc:java.awt.AWTPermission JavaDoc:java.io.FilePermission JavaDoc:java.lang.RuntimePermission JavaDoc:java.net.SocketPermission JavaDoc:java.util.PropertyPermission
出现Opera问题的原因可能是Opera有自己的java.policy文件,名为opera.policy(在Opera_installation_directory \ classes文件夹下)。 虽然,在我的Opera安装中,我看不到任何未在Opera中授予但在默认java.policy文件中授予的权限。