Asynchronous java 8 jnlp异步调用和权限

Asynchronous java 8 jnlp异步调用和权限,asynchronous,java-8,jnlp,Asynchronous,Java 8,Jnlp,我有一个简单的jnlp应用程序,演示java 8异步调用和访问特权数据,例如System.getProperties()。我已经在jnlp文件中为它授予了完全权限,并且代码使用正确的CA根证书进行了正确签名,但是代码仍然抛出异常。我找不到任何可以解释或解决此问题的内容,据我所知,所需的所有权限都已授予。有人能帮忙吗 守则: package com.text; import java.util.Properties; import java.util.concurrent.*; public c

我有一个简单的jnlp应用程序,演示java 8异步调用和访问特权数据,例如System.getProperties()。我已经在jnlp文件中为它授予了完全权限,并且代码使用正确的CA根证书进行了正确签名,但是代码仍然抛出异常。我找不到任何可以解释或解决此问题的内容,据我所知,所需的所有权限都已授予。有人能帮忙吗

守则:

package com.text;
import java.util.Properties;
import java.util.concurrent.*;

public class LambaTest {
    public static void main(String args[]) {
        CompletableFuture<String> test = CompletableFuture.supplyAsync( () -> {
        try {
                System.out.println("Asynchronous Thread");
                Properties properties = System.getProperties();
                System.out.println("https.protocols="+properties.get("https.protocols"));
                System.out.println("Asynchronous Thread successful");
                return "Hello";
            } catch(Exception e) {
                System.out.println("Asynchronous Thread FAILED");
                e.printStackTrace();
            }
            return null;
        });

        test.thenAccept(string -> {
            System.out.println("Priting String within async call " + string);
        });

        try{
            System.out.println("Main Thread");
            Properties properties = System.getProperties();
            System.out.println("https.protocols="+properties.get("https.protocols"));
            System.out.println("Main Thread successful");
        } catch (Exception er) {
            System.out.println("Main Thread FAILED");
            er.printStackTrace();
        }
    }
}

对于普通执行,方法的权限是当前调用堆栈上所有方法权限的交集

因此,如果调用代码的线程池的权限比代码小,甚至没有权限,那么代码在该调用上下文中的权限就更少,甚至没有权限

这确保了非特权方法不能简单地通过调用不知道的特权方法来执行特权操作。特权方法负责验证调用方的参数,如果操作被认为与安全相关,则执行自己的安全检查,然后显式调用以声明不应考虑间接调用方的特权。如果没有发生这种情况,则无特权的调用方仍然不能滥用该方法来提升其权限

public class LambdaTest {
    public static void main(String args[]) {
        CompletableFuture<String> test = CompletableFuture.supplyAsync(() -> {
            System.out.println("Asynchronous Thread");
            PrivilegedAction<Properties> action = System::getProperties;
            Properties properties = AccessController.doPrivileged(action);
            System.out.println("https.protocols="+properties.get("https.protocols"));
            return "hello";
        }).whenComplete((string, throwable) -> {
            if(throwable != null) {
                System.err.println("async action failed");
                throwable.printStackTrace();
            }
            else System.out.println("Async call returned " + string);
        });

        try{
            System.out.println("Main Thread");
            Properties properties = System.getProperties();
            System.out.println("https.protocols="+properties.get("https.protocols"));
            System.out.println("Main Thread successful");
        } catch (Exception er) {
            System.out.println("Main Thread FAILED");
            er.printStackTrace();
        }
        test.join();
    }
}
公共类LambdaTest{
公共静态void main(字符串参数[]){
CompletableFuture测试=CompletableFuture.SupplySync(()->{
System.out.println(“异步线程”);
PrivilegedAction=System::getProperties;
Properties=AccessController.doPrivileged(操作);
System.out.println(“https.protocols=“+properties.get”(“https.protocols”);
回复“你好”;
}).完成时((字符串,可丢弃)->{
if(可丢弃!=null){
System.err.println(“异步操作失败”);
printStackTrace();
}
else System.out.println(“异步调用返回”+字符串);
});
试一试{
System.out.println(“主线程”);
Properties=System.getProperties();
System.out.println(“https.protocols=“+properties.get”(“https.protocols”);
System.out.println(“主线程成功”);
}捕获(异常er){
System.out.println(“主线程失败”);
printStackTrace();
}
test.join();
}
}
顺便说一下,当您想要获取单个属性时,应该使用
System.getProperty(String)
。如各国所述:

请注意,即使安全管理器不允许
getProperties
操作,它也可以选择允许
getProperty(String)
操作


可能的重复根据上述问题,您似乎需要使用自定义执行器,因为公共forkjoin池在受限制的上下文中运行,没有读取属性的权限。现在我正确理解了我的问题以及Holger给出的答案,它是的重复。然而,我仍然觉得霍尔格的答案更好,因为他对一个具体案例给出了具体的解决方案。这可以作为副本中描述的一般解决方案的一个具体例子。事实上,有些副本很好保留,因为它们对问题和解决方案提出了不同的观点。
Asynchronous Thread
Asynchronous Thread FAILED
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "*" "read,write")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at com.sun.javaws.security.JavaWebStartSecurity.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPropertiesAccess(Unknown Source)
    at java.lang.System.getProperties(Unknown Source)
    at com.test.LambaTest.lambda$main$0(LambaTest.java:17)
    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)
Priting String within async call null
Main Thread
https.protocols=TLSv1.2,TLSv1.1,TLSv1
Main Thread successful
public class LambdaTest {
    public static void main(String args[]) {
        CompletableFuture<String> test = CompletableFuture.supplyAsync(() -> {
            System.out.println("Asynchronous Thread");
            PrivilegedAction<Properties> action = System::getProperties;
            Properties properties = AccessController.doPrivileged(action);
            System.out.println("https.protocols="+properties.get("https.protocols"));
            return "hello";
        }).whenComplete((string, throwable) -> {
            if(throwable != null) {
                System.err.println("async action failed");
                throwable.printStackTrace();
            }
            else System.out.println("Async call returned " + string);
        });

        try{
            System.out.println("Main Thread");
            Properties properties = System.getProperties();
            System.out.println("https.protocols="+properties.get("https.protocols"));
            System.out.println("Main Thread successful");
        } catch (Exception er) {
            System.out.println("Main Thread FAILED");
            er.printStackTrace();
        }
        test.join();
    }
}