Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Web Start应用程序获得不受限制的访问权限,但仍请求权限_Java_Java Web Start - Fatal编程技术网

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

Java Web Start应用程序获得不受限制的访问权限,但仍请求权限,java,java-web-start,Java,Java Web Start,我有一个JavaWebStart(Java8U121)应用程序,它应该在用户系统上以完全访问权限运行 所有要求以完全访问的方式运行的要求都已经满足,基本上我们使用webstart maven插件以官方证书对完整应用程序(所有JAR)进行签名。JNLP请求“所有权限”。这还为每个jar中的MANIFEST.MF设置了几个属性 当我启动应用程序(见图)时,它请求“无限制访问” 运行应用程序时,它会尝试从其他Web服务器下载一些图像,这通常会导致以下对话框: 显示对话框的线程堆栈跟踪如下所示:

我有一个JavaWebStart(Java8U121)应用程序,它应该在用户系统上以完全访问权限运行

所有要求以完全访问的方式运行的要求都已经满足,基本上我们使用webstart maven插件以官方证书对完整应用程序(所有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)
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
在java.lang.Object.wait(未知源)
位于com.sun.javaws.ui.JavawsSysRun.delegate(未知源)
-锁定(一个java.lang.Object)
位于com.sun.deploy.util.DeploySysRun.execute(未知源)
位于com.sun.deploy.util.DeploySysRun$1.run(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于com.sun.deploy.util.DeploySysRun.executePrivileged(未知源)
位于com.sun.deploy.ui.UIFactory.showApiDialog(未知源)
位于com.sun.deploy.uitoolkit.impl.awt.ui.UIFactoryImpl.showMessageDialog(未知源)
位于com.sun.deploy.uitoolkit.impl.awt.ui.UIFactoryImpl.showMessageDialog(未知源)
在com.sun.jnlp.ApiDialog.askUser上(未知来源)
在com.sun.jnlp.ApiDialog.askUser上(未知来源)
在com.sun.jnlp.ApiDialog.askConnect上(未知源)
位于com.sun.javaws.security.JavaWebStartSecurity.checkURLPermissionHelper(未知源)
位于com.sun.javaws.security.JavaWebStartSecurity.checkPermission(未知源)
位于sun.net.www.protocol.http.HttpURLConnection.URLtoSocketPermission(未知源)
...
位于java.util.concurrent.CompletableFuture$AsyncSupply.run(未知源)
位于java.util.concurrent.CompletableFuture$AsyncSupply.exec(未知源)
位于java.util.concurrent.ForkJoinTask.doExec(未知源)
位于java.util.concurrent.ForkJoinPool$WorkQueue.runTask(未知源)
位于java.util.concurrent.ForkJoinPool.runWorker(未知源)
位于java.util.concurrent.ForkJoinWorkerThread.run(未知源)
最大的问题是,请求权限的对话框经常出现在主屏幕后面(但它仍然会阻止主屏幕的输入)

我已经能够将此问题追溯到
ForkJoinPool
。这显然总是有额外的保护。见Doug Lea


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

我看到两种解决方案

首先,您可以在
ForkJoinPool
上运行的任务内部使用


或者,您可以通过在应用程序开始时调用
System.setSecurityManager(null)
来禁用整个应用程序的
SecurityManager
(在您提到的
ForkJoinPool

上运行的代码之外,图像是从另一个web服务器下载的,这意味着jvm启动了一个新的不受信任的连接。这会导致jvm调用安全提示。如果要避免此弹出对话框,只需嵌入imag即可在jar文件中加载jar文件,并移动到承载java web start应用程序的web服务器目录。然后,使用延迟下载策略将此jar文件添加到资源标记中。最后,在需要时使用服务实现加载jar文件资源。

将CompletableFuture与java web start组合使用时,请使用自定义执行器。请参阅此处的原因


对于我的(不受限制的)应用程序,情况并非如此,因为允许在不同线程(不在ForkJoinPool中)上连接到同一服务器,而不发出任何警告(因此,如果我禁用ForkJoinPool上的连接,则不会出现任何警告)。请确保使用JaNeLA检查JNLP,JaNeLA在我的网站上提供。
 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)