一、policy编写问题
环境:window8.1,jdk7
直接附上测试代码:
public class PermissionTest {
public static void main(String[] args) {
OutputStream os = null;
try {
os = new FileOutputStream("hehe.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if(os != null) {
try {
os.close();
os = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
我们知道在默认的情况下,java应用程序是不安装安全管理器的,所以这段代码是可以正常执行。安装安全管理器有两种方法:
(1)在代码中添加:System.setSecurityManager(new SecurityManager());
(2)java -Djava.security.manager -Djava.security.policy=策略文件位置 PermissionTest
首先,若不指定策略文件,会报入如下异常:
然后,指定策略文件,myPolicy.policy文件内容如下:
grant codeBase "file://F:/dev/java/notepad/permission/" {
permission java.io.FilePermission "F:\\dev\\java\\notepad\\-", "read,write";
};
按照java核心技术,策略文件的编写需要注意两点:
(1)codeBase路径问题,codeBase中的路径总是以斜杠作为文件分隔符,即使是Windows中的文件路径。如果codeBase中的路径以"/"结束,则表示一个目录,负责被视为一个jar文件名字
(2)指定文件权限(FilePermission)时的目标路径
按照书上说的,myPolicy.policy内容应该是正确的,执行结果仍然报上面的异常。为什么呢??百度、google没得到答案,自己鼓捣鼓捣,终于找到原因~原因就是file:后面不能要"//",修改如下:
grant codeBase "file:F:/dev/java/notepad/permission/" {
permission java.io.FilePermission "F:\\dev\\java\\notepad\\-", "read,write";
};
最终,正确执行。看来是在windows下指定codeBase时,file后面不能要"//"
二、policy文件路径问题
直接代码:
public class PermissionTest {
public static void main(String[] args) {
System.setProperty("java.security.policy", "myPolicy.policy");
System.setSecurityManager(new SecurityManager());
OutputStream os = null;
try {
os = new FileOutputStream("hehe.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if(os != null) {
try {
os.close();
os = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
对于System.setProperty("java.security.policy", "myPolicy.policy"),我们知道myPolicy.policy使用的是相对路径,即去当前目录下找myPolicy.policy文件。 如果不使用eclipse等ide工具,将myPolicy放当前目录下,没有问题。目录如下:
然而,若使用myeclipse等ide工具,不能将myPolicy.policy文件放src目录下,而是要放到工程目录下。目录结构如下:
按常规理解:myPolicy.policy放src目录下,编译后会和class文件一起放到bin目录下,应该可以执行,干嘛要放到工程目录下呢?猜测:myeclipse将bin目录看为是classpath路径,myPolicy.policy等采用相对路径的文件需和bin(即classpath)在同一目录下才可被访问。