我有一个Java Web Start(Java 8u121)应用程序,它应该在用户系统上以完全访问权限运行。
已经采取了所有以完全访问权限运行的要求,基本上我们使用webstart-maven-plugin来使用官方证书对整个应用程序(所有jar)进行签名。 JNLP请求'所有权限'。这也为每个jar中的MANIFEST.MF设置了几个属性。
当我启动应用程序(见图片)时,它会请求“不受限制的访问”。
运行应用程序时,它会尝试从另一个Web服务器下载一些图像,这总是会导致以下对话框:
显示对话框的线程的堆栈跟踪如下:
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Unknown Source)
at com.sun.javaws.ui.JavawsSysRun.delegate(Unknown Source)
- locked <0x0000000081e16908> (a java.lang.Object)
at com.sun.deploy.util.DeploySysRun.execute(Unknown Source)
at com.sun.deploy.util.DeploySysRun$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.util.DeploySysRun.executePrivileged(Unknown Source)
at com.sun.deploy.ui.UIFactory.showApiDialog(Unknown Source)
at com.sun.deploy.uitoolkit.impl.awt.ui.UIFactoryImpl.showMessageDialog(Unknown Source)
at com.sun.deploy.uitoolkit.impl.awt.ui.UIFactoryImpl.showMessageDialog(Unknown Source)
at com.sun.jnlp.ApiDialog.askUser(Unknown Source)
at com.sun.jnlp.ApiDialog.askUser(Unknown Source)
at com.sun.jnlp.ApiDialog.askConnect(Unknown Source)
at com.sun.javaws.security.JavaWebStartSecurity.checkURLPermissionHelper(Unknown Source)
at com.sun.javaws.security.JavaWebStartSecurity.checkPermission(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.URLtoSocketPermission(Unknown Source)
...
at java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
at java.util.concurrent.CompletableFuture$AsyncSupply.exec(Unknown Source)
at java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source)
at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
最大的问题是请求许可的对话框经常出现在我们的主屏幕后面(但它仍然会阻止对主屏幕的输入)。
我已经能够将此问题追踪到ForkJoinPool
。显然总是运行额外的保护。见Doug Lea的this post。
禁用此功能的最佳方法是什么?我希望这是一个应用程序范围的解决方案。
答案 0 :(得分:1)
在组合java web start中使用CompletableFuture时使用自定义执行程序。在此处查看原因http://blog.aggregat4.net/posts/2015-04-14-caution-advised-when-using-the-java-forkjoinpool-or-parallel-streams-with-a-securityManager.html
public static final ExecutorService SWING_POOL = Executors
.newFixedThreadPool(10, new ThreadFactory() {
private int count = 0;
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, "swing-executor-pool-" + count++);
t.setPriority(Thread.MIN_PRIORITY);
t.setDaemon(true);
return t;
}
});
//...
supplyAsync(() -> doStuff(), SWING_POOL)
答案 1 :(得分:0)
我看到了两个解决方案。
首先,您可以在ForkJoinPool
上运行的任务中使用AccessController.doPriviledged()
。
或者,您可以在应用程序开始时调用SecurityManager
(在System.setSecurityManager(null)
上运行的代码之外,为您的完整应用程序禁用ForkJoinPool
。
答案 2 :(得分:0)
您在此处提到过,图片是从另一个网络服务器下载的,意味着新的不受信任的连接正在从jvm中被解雇。这会导致jvm调用安全提示。如果你想避免这个弹出对话框,只需将你的图像嵌入到jar文件中并移动到托管你的java web start应用程序的web服务器目录。然后,在资源标签中添加这个jar文件,并使用延迟下载策略。最后,使用DownloadService服务实现在需要时加载jar文件资源。