前言:
安全管理器和类装载器都可以自定义,安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比描上述描述要复杂得多,这里仅仅举个例子,
有个形象思维。
实现:
第一步,定义一个类继承自SecurityManger重写它的checkRead方法:
public class MySecurityManager extends SecurityManager { @Override public void checkRead(String file) { //super.checkRead(file, context); if (file.endsWith("test")) throw new SecurityException("你没有读取的本文件的权限"); } }
第二步,定义一个有main函数的public类来验证自己的安全管理器是不是器作用了。
import java.io.FileInputStream; import java.io.IOException; public class TestMySecurityManager { public static void main(String[] args) { System.setSecurityManager(new MySecurityManager()); try { FileInputStream fis = new FileInputStream("test"); System.out.println(fis.read()); } catch (IOException e) { e.printStackTrace(); } } }
第三步,运行代码查看控制台输出:
java.lang.SecurityException: 你没有读取的本文件的权限 at MySecurityManager.checkRead(MySecurityManager.java:7) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at TestMySecurityManager.main(TestMySecurityManager.java:10)
上面的异常我们发现,安全管理器起作用了, 在 《 jvm_7_安全管理器简介》中使用的是-Djava.security.manager安装过默认的安全管理器, 这里使用自定义安全器。
拓展内容:
为何要重写checkRead方法呢? 看下面代码即可知:
public FileInputStream(File file) throws FileNotFoundException { String name = (file != null ? file.getPath() : null); SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(name); } if (name == null) { throw new NullPointerException(); } fd = new FileDescriptor(); open(name); }
文件流创建时候先 执行SecurityManager security = System.getSecurityManager();,然后再调用security的checkRead方法, 因此上面 重写了checkRead方法。
SecurityManager 的应用很广,如下案例(java的File.setWritable方法), 下面就使用了SecurityManager的checkWrite方法,如果我们想通过checkWrite验证自定义安全管理器是否应用到类中时, 还需要重写 checkWrite方法
public boolean setWritable(boolean writable, boolean ownerOnly) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkWrite(path); } return fs.setPermission(this, FileSystem.ACCESS_WRITE, writable, ownerOnly); }
相关推荐
练习JVM调优-jvm_demo
linux nginx nginx_upstream_jvm_route
4_JVM_8~11章.pdf
JVM_工作原理.JVM_工作原理.JVM_工作原理.
JVM_GC调优
今天开机发布程序,启动项目,竟然报错说8080端口被占用,没关系 只要是把占用这个端口的进程杀掉即可
一个jvm的学习资料,对新手很有帮助,建议收藏
JVM_GC_-调优总结
JVM_启动参数_总结。详细介绍JVM的详细启动参数及JVM垃圾回收机制。
inside jvm 所有源代码,包括原理的java applet演示图,以及所有用的到的源代码
VC调用java的简单例子。需要注意jvm.dll路径,路径不对就不能成功!
java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf
Java_Jvm_Jsp_Spring3_Struts2_Hibernate_Oracle _
JVM内存模型以及垃圾回收,初级人员必看
nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。 安装方法(进入Nginx源码目录): #patch -p0 < /path/to/this/directory/jvm_route.patch # ./configure -...
jvm_session_demo
3_JVM_6~7章.pdf
2_JVM_3章下~5.pdf
JVM_03 垃圾回收,工作笔记
关于tomcat的JVM设置参数,可以有效地管理内存,释放内存。