我是一个允许任何人上传自己的产品(jar 文件)的平台的所有者,我希望使用 java 策略文件来保护该平台。
我正在使用 JRE azul-1.8.9_345,
我正在测试这个程序,
public static void main(String[] args) {
String url = "http://www.java2s.com/Code/JarDownload/test/test.jar.zip";
try {
download(url, "C:\\Users\\User\\Desktop\\Test.jar");
} catch (IOException exception) {
exception.printStackTrace();
}
}
private static void download(String urlStr, String file) throws IOException{
URL url = new URL(urlStr);
BufferedInputStream bis = new BufferedInputStream(url.openStream());
FileOutputStream fis = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int count=0;
while((count = bis.read(buffer,0,1024)) != -1)
{
fis.write(buffer, 0, count);
}
fis.close();
bis.close();
}
我想使用策略文件来阻止这个程序运行,
到目前为止我的尝试都没有奏效,我开始怀疑这可能是一个不受支持的功能,它可能不再起作用了。
这是我的政策
grant CodeBase "file:HelloWorld.jar" {
permission java.io.FilePermission "C:\Users\User\Desktop\", "read";
};
我试过使用其他权限,但它们似乎也无能为力,感谢您的帮助。
有人可以布局,为什么这不起作用?为什么我需要指定文件?即使在我运行 jar 时给出,在哪里可以找到权限列表及其参数? (权限 java.io.ExamplePermission (args), (args))
Launcher\files\azul-1.8.9_345\bin\java.exe -jar HelloWorld.jar -Djava.security.manager -Djava.security.policy=C:\Users\User\Desktop\policy.policy
我尝试过使用其他权限,它们也没有影响程序。
您不传递任何 VM 参数来启用安全管理器。
您当前的命令行是:
java -jar HelloWorld.jar -Djava.security.manager -Djava.security.policy=...
这意味着,
-Djava.security.manager -Djava.security.policy=...
作为程序参数传递,而不是 VM 参数。
VM 参数必须出现在
-jar file
或 classname
之前。args
传递给main方法。
要解决这个问题,请使用
Launcher\files\azul-1.8.9_345\bin\java.exe -Djava.security.manager -Djava.security.policy=C:\Users\User\Desktop\policy.policy -jar HelloWorld.jar
那你的保单文件格式不对
在
"
里面,\
需要用\\
转义。
此外,代码库不使用相对文件名,而是文件 URL。
所以,政策文件应该是这样的:
grant codebase "file:/C:/Users/User/Desktop/HelloWorld.jar" {
permission java.io.FilePermission "C:\\Users\\User\\Desktop\\-", "read";
};
如果您的策略文件包含错误,它可能根本无法使用,从而使调试变得困难。