知识大全 jvm学习:策略和保护域

Posted

篇首语:遇到一些人,知道一些事,才能懂的理解与珍惜,才能看清自己的方向。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 jvm学习:策略和保护域相关的知识,希望对你有一定的参考价值。

  前面一节 我们做了一个简单的实验 来说明什么是策略文件 在文章的最后 也顺带的讲了一下什么是策略 还有策略的作用

  为了引出另外一个很重要的概念ProtectionDomain(保护域) 所以我们还是要先来回顾一下什么是策略

  首先 什么是策略 今天的东西纯粹是比较概念的 当然 如果你读过笔记九 今天的东西 就真的是soso

  策略与策略文件

  java对应用程序的访问控制策略是由抽象类java security Policy的一个子类的单例所表示 任何时候 每个应用程序实际上只有一个Policy对象 Policy对象对应着策略文件 类装载器利用这个Policy对象来帮助他们决定 在把一段代码导入虚拟机时应该给予什么权限

  上面那段话告诉我们一个应用程序对应一个策略对象 一个策略对象对应一个策略文件

  那么策略文件 除了对我们笔记九中一个文件夹下的所有文件起限制作用外还能对什么主体起作用呢?先来看看下面的策略文件myPolicy txt

  keystore ijvmkeys

  grant signedby friend

  permission java io FilePermission d:/testPolicy txt read write ;

  ;

  grant signedby stranger

  permission java io FilePermission d:/testPolicy txt read write ;

  ;

  grant codeBase file:D:/workspace/TestPolicy/bin/*

  permission java io FilePermission d:/testPolicy txt read write ;

  ;

  简单的解读一下

  第一行 keystore ijvmkeys 这一行的意思 密钥对存放在当前目录一个叫ijvmkeys的文件里(记得笔记八做过的jar包签名实验吗)

  第二行 grant signedby friend grant是授权的意思 这一行的意思是 给一个被 friend 的密钥对签名的文件授权

  第三行 permission java io FilePermission d:/testPolicy txt read write ;这行的意思是对于d:/testPolicy txt赋予读写的权限

  倒数第三行 grant codeBase file:D:/workspace/TestPolicy/bin/* 这一句我们笔记九的时候见过 就是对D:/workspace/TestPolicy/bin/*下的所有文件赋予权限

  重点一 到这里我们应该可以知道 策略文件可以给一系列被签名的代码库( friend stranger 都是代码库)授权 也可以给一个代码来源(一个具体的路径或者说url就是一个代码来源)授权

  重点二 策略文件不仅可以存储在文件中(后缀名是什么不重要) 还可以存放在数据库里

  到了这里我们对策略有一个比较完整的概念了 但是你有没有这么一个疑问 前面我们总说 一个应用程序对应一个策略单例 一个策略单例对应一个策略文件 它到底怎么对应的?下面我们就来探究一下

  在探究之前 我们先引入一个新的概念叫保护域(ProtectionDomain) 在笔记三的时候 我们提到过类装载器将class文件load内存的时候会将它放置到一个保护域中 是滴今天我就来说说什么是保护域

  什么是保护域

  当类装载器将类型装入Java虚拟机时 它们将为每个类型指派一个保护域 保护域定义了授予一段特定代码的所有权限 (一个保护域对应策略文件中的一个或多个Grant子句 )装载入Java虚拟机的每一个类型都属于一个且仅属于一个保护域

  类装载器知道它装载的所有类或接口的代码库和签名者 它利用这些信息来创建一个CodeSource对象 它将这个CodeSource对象传递个当前Policy对象的getPermissions()方法 得到这个抽象类java security PermissionCollection的子类实例 这个PermissinCollection包含了到所有Permission对象的引用(这些Permission对象由当前策略授予指定代码来源) 利用它创建的CodeSource和它冲Policy对象得到的PermissionCollection 它可以实例化一个新的ProtectDomain对象 它通过将合适的ProtectionDomain对象传递给defineClass()方法 来将这段代码放到一个保护域中

  如果你对上面这段话理解不了 看下面这个图

  

  

  好了看完上面的这整个过程之后你是否已经理解什么是保护域了

  下面我们在整理一下内容 概念有点多 一个一个的来

  codeSource:代码源 这个是类装载器生成的java security CodeSource的一个对象 classLoader通过读取class文件 jar包得知谁为这个类签过名(可以有过个签名者 关于签名请查看笔记七和八)而封装成一个签名者数组赋给codeSource对象的signers成员 通过这个类的来源(可能来自一个本地的url或者一个网络的ur 对应了grant笔记九里myPollicy里的 friend 或者file::…l)赋给codeSource的location成员 还有这个类的公钥证书赋给codeSource的certs成员(通常一个jar是能够被多个团体或者机构担保的 也就是我们说的认证 在java 的默认安全管理器还有访问控制体系结构都只能对证书起作用 而不能对赤裸的公钥起作用 而实际上 我们用keytool生成密钥对时 同时会生成一个自签名证书 所以keytool生成的密钥对并不是赤裸的) 如果你有疑问 我们看一下jdk里的代码

  public class CodeSource implements java io Serializable

  private static final long serialVersionUID = L;

  /**

  * The code location

  *

  * @serial

  */

  private URL location;//本地代码库

  /*

  * The code signers

  */

  private transient CodeSigner[] signers = null;//签名者

  /*

  * The code signers Certificate chains are concatenated

  */

  private transient java security cert Certificate certs[] = null;//证书

  Policy:策略 就是用来读取策略文件的一个单例对象 通过传入的CodeSource对象(由于codeSource对象里包含了签名者和代码来源)所以他通过读取grant段 取出一个个的Perssiom然后返回一个PerssiomCollection 这个类里有一个很重要的成员变量

  // Cache mapping  ProtectionDomain to PermissionCollection

  private WeakHashMap pdMapping;

  这个成员为什么重要 我们来看一个方法

  private static void initPolicy (final Policy p)

  ……

  if (policyDomain getCodeSource() != null)

  ……

  synchronized (p pdMapping)

  // cache of pd to permissions

  p pdMapping put(policyDomain policyPerms)

  

  

  return;

  

  我们主要看关键代码 这个pdMapping就是把保护域对象当做key将权限集合当做value存在在了这个map里 所以我们说一个保护域对应多个策略文件的grant子句的permission

  ProtectionDomain:保护域 前面我们已经介绍过了 他就是用来容纳class文件 还有perssiom codeSource的一个对象 如果你对此还有什么疑问 我们也看看它的代码 来验证一下我们的结论

  public class ProtectionDomain

  /* CodeSource */

  private CodeSource codesource ;//代码源

  /* ClassLoader the protection domain was consed from */

  private ClassLoader classloader;//类装载器

  /* Principals running as within this protection domain */

  private Principal[] principals;

  /* the rights this protection domain is granted */

  private PermissionCollection permissions;//权限集合

  Permission:权限 这个对应了我们笔记九里的grant子句里的一个permission 它的结构也很简单 权限名和动作 就好像我们笔记九里的java io FilePermission是一个权限名

  而动作则是read和write 在Permission中它对应一个字符串

  现在我们用一张图来把上面几个概念串联起来

cha138/Article/program/Java/hx/201311/26831

相关参考

知识大全 JVM调优的几种策略

JVM调优的几种策略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &nbs

知识大全 JVM异常发生时的应对策略

JVM异常发生时的应对策略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文向大家描述一下当J

知识大全 JVM内存模型及垃圾收集策略解析(2)

JVM内存模型及垃圾收集策略解析(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  二JAVA

在学习活动中通过寻求教师帮助和开展小组令作学习来促进学习的策略属于资源管理策略

在学习活动中通过寻求教师帮助和开展小组令作学习来促进学习的策略属于资源管理策略。_____答案:正确解析:资源管理策略是辅助学生管理可用的环境和资源的策略,对学生的动机有重要的作用。它主要包括时间管理

知识大全 元认知策略可以使学生意识和体验到学习情境有哪些变量

元认知策略可以使学生意识和体验到学习情境有哪些变量元认知有两个基本功能:意识性和调控性。元认知在学习策略系统中的作用有三方面:①可以使学生意识和体验到学习情景有哪些变量,并且意识到这些变量之间的关系与

知识大全 GC策略&内存申请、对象衰老

GC策略&内存申请、对象衰老  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    JVM里的GC(

在学习策略中下列不属于精加工策略的是

在学习策略中下列不属于精加工策略的是_____。A、记忆术B、提问C、做笔记D、列提纲答案:D解析:精细加工策略是一种将新学习材料与头脑中已有知识联系起来从而增加新信息意义的深层加工策略。常用的精细加

有时学习者为了加深对知识的理解,经常提出一系列的问题,这样的学习策略属于__

有时学习者为了加深对知识的理解,经常提出一系列的问题,这样的学习策略属于_____。A、元认知策略B、精细加工策略C、组织策略D、复述策略答案:B解析:提问是精细加工策略的一种重要方式之一。

知识大全 正确的学习方法与策略是什么

正确的学习方法与策略是什么?______________________________________________________________________1、做好学习计划,科学安排学习时

知识大全 Oracle学习应用之数据库性能优化策略

Oracle学习应用之数据库性能优化策略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据库系