Java Web Start应用程序获得不受限制的访问权限但仍请求权限

时间:2017-03-31 08:23:56

标签: java java-web-start

我有一个Java Web Start(Java 8u121)应用程序,它应该在用户系统上以完全访问权限运行。

已经采取了所有以完全访问权限运行的要求,基本上我们使用webstart-maven-plugin来使用官方证书对整个应用程序(所有jar)进行签名。 JNLP请求'所有权限'。这也为每个jar中的MANIFEST.MF设置了几个属性。

当我启动应用程序(见图片)时,它会请求“不受限制的访问”。

Application Starting

运行应用程序时,它会尝试从另一个Web服务器下载一些图像,这总是会导致以下对话框:

enter image description here

显示对话框的线程的堆栈跟踪如下:

  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

禁用此功能的最佳方法是什么?我希望这是一个应用程序范围的解决方案。

3 个答案:

答案 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文件资源。

相关问题