在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)
是否有在这些浏览器中生成假模态对话框的解决方法?
答案 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