Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以获取Java SE 9及其后续版本中更新的语言功能的摘要。
请参阅JDK发布说明以获取有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
一个安全管理器是一个为应用程序定义安全策略的对象。该策略指定了哪些操作是不安全或敏感的。任何不被安全策略允许的操作都会引发SecurityException
。应用程序还可以查询其安全管理器以了解哪些操作是被允许的。
通常情况下,一个web applet会在浏览器或Java Web Start插件提供的安全管理器下运行。其他类型的应用程序通常在没有安全管理器的情况下运行,除非应用程序自己定义了一个。如果没有安全管理器存在,应用程序就没有安全策略,可以无限制地执行操作。
本节解释了应用程序如何与现有的安全管理器交互。有关更详细的信息,包括如何设计安全管理器的信息,请参阅安全指南。
安全管理器是一个SecurityManager
类型的对象;要获取对该对象的引用,调用System.getSecurityManager
。
SecurityManager appsm = System.getSecurityManager();
如果没有安全管理器,该方法将返回null
。
一旦应用程序有了安全管理器对象的引用,它就可以请求执行特定操作的权限。许多标准库中的类都会这样做。例如,System.exit
用于以退出状态终止Java虚拟机,它调用SecurityManager.checkExit
来确保当前线程有权限关闭应用程序。
SecurityManager类定义了许多其他用于验证其他类型操作的方法。例如,SecurityManager.checkAccess
验证线程访问,SecurityManager.checkPropertyAccess
验证对指定属性的访问。每个操作或操作组都有自己的checkXXX()
方法。
此外,checkXXX()
方法集合代表了已经受到安全管理器保护的操作集合。通常情况下,应用程序不需要直接调用任何checkXXX()
方法。
许多在没有安全管理器的情况下是常规操作的操作在有安全管理器的情况下可能会抛出SecurityException
。即使调用的方法没有在文档中标记为抛出SecurityException
也是如此。例如,考虑以下用于写入文件的代码:
reader = new FileWriter("xanadu.txt");
在没有安全管理器的情况下,该语句会执行而不报错,前提是xanadu.txt
存在并且可写。但是假设将此语句插入到一个通常在安全管理器下运行且不允许文件输出的Web小程序中,可能会出现以下错误信息:
appletviewer fileApplet.html Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.io.FilePermission xanadu.txt write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkWrite(SecurityManager.java:962) at java.io.FileOutputStream.<init>(FileOutputStream.java:169) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at java.io.FileWriter.<init>(FileWriter.java:46) ...
注意,在这种情况下抛出的具体异常java.security.AccessControlException
是SecurityException
的子类。