我的程序中有一个按钮,当按下时,它会带你到我的wiki页面关于该程序.我使用以下行来执行此操作:
java.awt.Desktop.getDesktop().browse(new java.net.URI("http://supuh.wikia.com/wiki/BHT"));
Run Code Online (Sandbox Code Playgroud)
问题是,无论程序运行的环境如何,我总是会收到以下错误:
java.security.AccessControlException: access denied (java.awt.AWTPermission showWindowWithoutWarningBanner)
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?请注意,这仅适用于一个程序.我制作的任何其他程序都可以使用相同的方法,没有问题.
在我的程序开始时,添加了这个钩子.没有它,程序运行良好......
System.setSecurityManager(new SecurityManager()
{
@Override
public void checkExit(int status)
{
closeFile(status);
}
});
Run Code Online (Sandbox Code Playgroud)
需要这个钩子,但是这个browse(URI uri)方法不适用于它.解决方案?
这意味着您正在使用安全管理器:
SecurityException- 如果存在安全管理器并且它拒绝AWTPermission("showWindowWithoutWarningBanner")权限,或者不允许调用线程创建子进程; 而不是从applet或Java Web Started应用程序中调用
如果这是applet或Java Web Start应用程序 - 请在jar上签名.
更新添加安全管理器以检测程序退出是错误的.有多种方法可以正确地做到这一点.在你的情况下,我想这是最合适的:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
closeFile();
}
));
Run Code Online (Sandbox Code Playgroud)
Swing特定的解决方案是:
如果您不必执行额外操作,请使用 frame.setDefaultCloseAction(Frame.EXIT_ON_CLOSE)
使用addWindowStateListener和检查WindowEvent.WINDOW_CLOSED
那说,两个说明:
你不能长时间保持文件打开.用于try/catch/finally在需要时打开和关闭它们.
如果您确实需要某个安全管理器,请确保覆盖SecurityManager检查是否可以打开链接的相应方法.(不会告诉你哪一个,所以你不要试图跳到这个解决方案,这是错误的)
总而言之,我会setDefaultActionOnClose在读完/写完后立即关闭并关闭每个文件.
更新2:在您链接到原始问题后,描述了您想要实现的目标,事情会有所改变.您正在试图阻止出境,所以你需要一个SecurityManager.这使得你应该覆盖checkPermission方法并在那里不做任何事情(即不抛出异常),至少在检查这些权限时(在调用浏览时检查它们):
new AWTPermission("showWindowWithoutWarningBanner")new FilePermission("<<ALL FILES>>", SecurityConstants.FILE_EXECUTE_ACTION)更新3以下是如何完全覆盖该方法:
@Override
public void checkPermission(Permission permission) {
if (permission instanceof AWTPermission) {
if (permission.getName().equals("showWindowWithoutWarningBanner")) {
return;
}
}
if (permission instanceof FilePermission) {
if (permission.getActions().equalsIgnoreCase("execute")) {
return;
}
}
java.security.AccessController.checkPermission(permission);
}
Run Code Online (Sandbox Code Playgroud)
(你可以没有外面的if-s)
更新4只有在您授予程序权限的情况下,上述方法才有效.否则,JVM的一个记录不明确的行为是不允许覆盖安全管理器的非特权.看看这份报告 - 评论说如何解决这个问题.
为了让您的生活更简单,您可以@Override public void checkPermission(..)使用一个空的方法体.
| 归档时间: |
|
| 查看次数: |
2640 次 |
| 最近记录: |