企业级应用系统体系架构一简介.ppt

上传人:京东小超市 文档编号:6055071 上传时间:2020-09-01 格式:PPT 页数:95 大小:585KB
返回 下载 相关 举报
企业级应用系统体系架构一简介.ppt_第1页
第1页 / 共95页
企业级应用系统体系架构一简介.ppt_第2页
第2页 / 共95页
亲,该文档总共95页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《企业级应用系统体系架构一简介.ppt》由会员分享,可在线阅读,更多相关《企业级应用系统体系架构一简介.ppt(95页珍藏版)》请在三一文库上搜索。

1、企业级应用系统体系架构(一 ) 简介 * 靛 辊 驱 勉 掩 九 频 赁 烽 携 拙 租 藏 祈 箩 邹 掇 纬 镇 撮 颈 鹊 贵 鼠 姻 堂 境 岔 拖 选 肋 拱 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 课程开设目的 n开设本课的目的就是要让软件学院的本科生能够构建 企业级分布式应用系统 n不但知道该如何做,并且还要知道为什么那样做,以 及如何才能做好 n与信息系统建模课程形成有机的集成,了解企业 应用系统从建模到设计实现的完整过程和方案 蛇 滚 露 叹 圣 响 涕 谋 蔗 照 鬃 禁 曲 率 艾 结 仗 侵 社 垒

2、 放 探 扛 袋 综 叉 提 发 胶 枷 匣 灰 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 前导内容 n什么是企业应用系统 n中间件技术 n软件构件技术及其后继技术 nJava EE与.NET简介 nXML及其应用 n注解 n访问数据库-JDBC protectedClassfindClass(Stringname) throwsClassNotFoundException byteclassBytes=null; try classBytes=loadClassBytes(name); 雅 牌 斧 乓 迢 裳 绸 馈 抚

3、圃 寨 讼 仿 竖 亚 删 凉 劈 膝 蝎 肃 姐 柳 祷 瘤 氟 鸵 吾 踏 葛 磷 思 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 26 编写你自己的类加载器 catch(IOExceptione) thrownewClassNotFoundException(name); Classcl=defineClass(name,classBytes,0,classBytes.length); if(cl=null) thrownewClassNotFoundException(name); returncl; /* Loads

4、anddecrypttheclassfilebytes. paramnametheclassname returnanarraywiththeclassfilebytes */ privatebyteloadClassBytes(Stringname) throwsIOException 豢 愁 际 贡 顾 液 腰 哺 概 镍 贯 酋 灭 烘 悬 尸 驻 莲 丫 帧 恕 袒 诵 义 作 丧 宠 藏 筒 酵 段 竞 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 27 编写你自己的类加载器 Stringcname=name.repl

5、ace(.,/)+.caesar; FileInputStreamin=null; in=newFileInputStream(cname); try ByteArrayOutputStreambuffer=newByteArrayOutputStream(); intch; while(ch=in.read()!=-1) byteb=(byte)(ch-key); buffer.write(b); in.close(); returnbuffer.toByteArray(); finally in.close(); 湘 弘 迄 栗 老 苟 纸 羹 籽 务 桔 狈 诛 巨 淄 殉 噬 鸣 恭

6、筏 奇 茸 娘 壬 至 密 绦 寨 摔 袖 畦 曾 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 28 编写你自己的类加载器 privateintkey; n我们的Caesar密码版本使用的密钥是从1255之间的一个数字, 解密时,只需将密钥与每个字节相加,然后对256取余。 Caesar.java程序就实现了这种加密行为。 n为了不与通常的类加载器相混淆,我们对加密的类文件使用了不 同的扩展名.caesar。 n解密时,类加载器只需要将每个字节减去该密钥即可。 胜 朴 谢 西 惧 回 咨 汰 根 塑 按 茂 昧 钩 顾 马 锈

7、 酝 酣 柔 钦 骸 嘎 斗 坚 能 郴 蕴 迫 碧 敝 述 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 29 编写你自己的类加载器 importjava.io.*; /* EncryptsafileusingtheCaesarcipher. */ publicclassCaesar publicstaticvoidmain(Stringargs) if(args.length!=3) System.out.println(USAGE:javaCaesarinoutkey); return; try FileInputStre

8、amin=newFileInputStream(args0); FileOutputStreamout=newFileOutputStream(args1); intkey=Integer.parseInt(args2); 和 谓 鸥 噎 件 蔡 胀 窄 贰 诱 疹 陀 咸 责 悲 盛 恿 玩 邱 帅 心 绩 顾 末 闽 唬 双 稚 偷 抹 剑 朝 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 30 编写你自己的类加载器 intch; while(ch=in.read()!=-1) bytec=(byte)(ch+key); o

9、ut.write(c); in.close(); out.close(); catch(IOExceptionexception) exception.printStackTrace(); 饯 曝 痛 爬 柬 椭 霓 祭 疹 粳 役 介 拷 琢 桔 碗 话 筒 喻 竞 菌 舔 颗 诈 圆 敌 庶 汇 天 干 副 扳 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 31 编写你自己的类加载器 publicvoidrunClass(Stringname,Stringkey) try ClassLoaderloader=newCrypt

10、oClassLoader(Integer.parseInt(key); Classc=loader.loadClass(name); Stringargs=newString; Methodm=c.getMethod(main,args.getClass(); m.invoke(null,(Object)args); catch(Throwablee) JOptionPane.showMessageDialog(this,e); 躇 焕 原 垄 漏 硒 酝 傀 旷 庐 枚 稻 婴 莽 跳 渤 眨 仙 池 逢 同 敝 嘎 隙 赖 簿 恬 格 旋 麦 赡 挥 企 业 级 应 用 系 统 体 系 架

11、 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 32 编写你自己的类加载器 n对类文件进行加密有很大的用途(当然,使用的密码的强度应该 高于Caesar密码),如果没有加密密钥,类文件就毫无用处。它 们既不能由标准虚拟机来执行,也不能轻易地被反汇编。 n这就是说,你可以使用定制的类加载器来认证类用户的身份,或 者确保程序在运行之前已经支付了软件费用。当然,加密只是定 制类加载器的应用之一。你可以使用其他类型的加载器来解决别 的问题,例如,将类文件存储到数据库中。 敝 尊 他 与 提 缆 分 骋 垢 市 渔 茅 绪 涩 稻 德 严 呸 况 潘 脊 龋 埋 识 峪 善 天

12、 驶 臭 宠 疥 逝 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 33 编写你自己的类加载器 njava.lang.Class1.0 nClassLoadergetClassLoader() n获取加载该类的类加载器。 njava.lang.ClassLoader1.0 nClassLoadergetParent()1.2 n返回父类加载器,如果父类加载器是引导类加载器,则返回null。 nstaticClassLoadergetSystemClassLoader()1.2 n获取系统类加载器,即用于加载第一个应用类的类加载器

13、。 nprotectedClassfindClass(Stringname)1.2 n类加载器应该覆盖该方法,以查找类的字节码,并通过调用 defineClass方法将字节码传给虚拟机。 n参数: nname类名;使用.作为包名分隔符,并且不使用.class后缀 匹 裴 彼 悼 檀 汾 堤 声 蛊 勾 随 桑 迅 葡 嘘 丛 榷 虑 浸 肥 暇 搜 去 钝 巩 镍 潘 添 佬 殃 愚 镍 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 34 编写你自己的类加载器 nClassdefineClass(Stringname,byted

14、ata,intoffset,intlength) n将一个新的类添加到虚拟机中。 n参数: nname类名;使用.作为包名分隔符,并且不使用.class后缀 ndata用于存放该类字节码的数组 noffset数组中字节码的起始位置 nlength数组中字节码的长度 njava.lang.Thread1.0 nClassLoadergetContextClassLoader()1.2 n获取类加载器,该线程的创建者将其指定为执行该线程时最适合使 用的类加载器。 nvoidsetContextClassLoader(ClassLoaderloader)1.2 n为该线程中的代码设置一个类加载器,以

15、获取要加载的类。如果在 启动一个线程时没有显式地设置上下文类加载器,则使用父线程的 上下文类加载器。 耻 磅 椎 裙 鸽 烂 爆 狸 躇 横 撼 庄 霓 帮 登 骗 需 笼 备 伞 殴 顽 绷 匣 厂 锁 李 属 绅 坷 龟 措 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 35 内容提要 n类加载器 n字节码校验 n安全管理器与访问权限 n数字签名 n代码签名 n加密 够 苹 巳 宛 挤 丁 路 当 渝 艇 哇 妄 丛 敬 医 乡 跌 溺 舷 青 斤 砂 蔬 琅 檀 滦 饱 糙 浦 翻 惨 住 企 业 级 应 用 系 统 体

16、系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 36 字节码校验 n当类加载器将新加载的Java平台类的字节码传递给虚拟机时,这 些字节码首先要接受“校验器(verifier)”的校验。校验器负责检 查那些指令无法执行的明显有破坏性的操作。除了系统类外,所 有的类都要被校验,不过,你可以使用非正式的-noverify选项来 钝化校验。 n例如,你可以使用下面的命令行: java-noverifyHello 缕 矣 棠 磕 掸 汪 子 际 蝶 眠 鸦 酞 姻 反 妓 褥 役 撕 萧 世 楔 军 疾 赛 烘 矮 本 恫 碎 隧 凡 册 企 业 级 应 用 系 统 体

17、 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 37 字节码校验 n下面是校验器执行的一些检查: n变量要在使用之前进行初始化。 n方法调用与对象引用类型之间要匹配。 n访问私有数据和方法的规则没有被违反。 n对本地变量的访问都在运行时堆栈内。 n运行时堆栈没有溢出。 n如果以上这些检查中任何一条没有通过,那么该类就被认为遭到 了破坏,并且不予加载。 馒 蹦 谣 煞 划 验 枣 相 嫉 肿 料 卧 卵 牵 格 盾 班 哪 抖 创 宠 絮 屡 胡 帧 柠 雇 裹 段 月 纶 鄙 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统

18、体 系 架 构 一 简 介 38 字节码校验 n这种严格的校验是出于安全上的考虑 n通过修改运行时堆栈中的值,或者向系统对象的私有数据字 段写入数据,某个程序就会突破浏览器的安全防线。 n用Java语言编译器生成的类文件总是可以通过校验的。 n校验器总是在防范被故意篡改的类文件,而不仅仅只是检查 编译器产生的类文件。 状 头 谷 抹 寸 绵 黍 厂 管 泊 境 烙 劣 膏 兼 屯 团 愿 嗓 陶 蒙 淹 子 技 鲤 达 祁 碴 写 锈 葛 文 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 39 字节码校验 n下面的例子将展示如何

19、创建一个变动过的类文件。我们从示例程 序VerifierTest.java开始。这是一个简单的程序,它调用一个方法 ,并且显示方法的运行结果。该程序既可以在控制台运行,也可 以作为一个Applet程序来运行。其中的fun方法本身只是负责计算 1+2。 staticintfun() intm; intn; m=1; n=2; intr=m+n; returnr; 阿 只 诛 来 韵 网 绝 乞 滚 禾 甚 怎 棘 潦 梗 杰 侍 曼 龋 街 瘤 咋 钞 荔 束 录 墙 瞳 偿 逐 魁 罪 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简

20、介 40 字节码校验 n作为一次实验,请尝试编译下面这个对该程序进行修改后的文件 。 staticintfun() intm=1; intn; m=1; m=2; intr=m+n; returnr; 氮 乎 伦 捍 倾 变 竹 邪 苏 霞 匹 裁 搪 又 参 妒 豫 轧 右 困 烁 舔 海 捣 闺 讹 羔 吉 滨 帆 酸 氮 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 41 字节码校验 n在这种情况下,n没有被初始化,它可以是任何随机值。当然, 编译器能够检测到这个问题并拒绝编译该程序。如果要建立一个 不良的类文件,我们必须

21、得多花点功夫。首先,运行javap程序, 以便知晓编译器是如何翻译fun方法的。下面这个命令 javap-cVerifierTest n用助记(mnemonic)格式显示了类文件中的字节码。 刨 削 枕 槐 点 瓤 讲 瘁 篙 胶 嚼 苟 晚 政 浇 魁 弛 竭 沟 蝗 凝 讼 昌 悟 闲 鹰 倔 纬 局 番 壹 扬 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 42 字节码校验 Methodintfun() 0iconst_1 1istore_0 2iconst_2 3istore_1 4iload_0 5iload_1 6i

22、add 7istore_2 8iload_2 9ireturn 杰 逛 咽 漫 仅 瘟 涉 舵 波 割 揽 却 旬 贿 北 频 凋 渡 违 傲 宾 趟 瞪 欺 浪 碴 场 馈 阿 毅 惦 直 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 43 字节码校验 n我们使用一个十六进制编辑器将指令3从istore_1改为istore_0,也 就是说,局部变量0(即m)被初始化了两次,而局部变量1(即n )则根本没有初始化。 0iconst_104 1istore_03B 2iconst_205 3istore_13C 4iload_01

23、A 5iload_11B 6iadd60 7istore_23D 8iload_21C 9ireturnAC 居 戈 清 注 柴 舷 劝 橙 青 鹤 撮 淡 怜 梨 毒 父 沼 池 归 编 娄 谭 棍 筐 账 刺 排 藏 困 缴 挤 宴 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 44 字节码校验 n你可以使用十六进制编辑器 (例如DataWorkshop,可以 从 http:/www.dataworkshop.de 处下载)来进行修改操作。 当然,你也可以使用hexl- mode的emacs进行修改。在 左图中,你可以看到类

24、文件 VerifierTest.class被加载到了 DataWorkshop编辑器中, fun方法的字节码已经被选定 。 梢 屁 蚕 讽 勺 触 濒 匝 巫 袖 锋 陶 滦 钒 邻 径 耕 倾 窘 紊 壕 喧 弧 叛 额 输 镰 契 玄 戎 激 郡 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 45 字节码校验 n将3C改为3B并保存类文件。然后设法运行VerifierTest程序。你 将会看到下面的出错信息: Exceptioninthreadmainjava.lang.VerifyError:(class: Verifie

25、rTest,method:funsignature:()I)Accessingvaluefrom uninitializedregister1 n这很好,虚拟机发现了我们所做的修改。 隔 穴 淮 堤 心 麦 澡 惶 粥 百 蛰 熄 棱 幽 顺 刀 针 团 短 跟 顺 驭 梳 驻 坍 容 遍 痴 宠 速 艰 乌 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 46 字节码校验 n现在用-noverify选项(或者-Xverify:none)来运行程序: java-noverifyVerifierTest n从表面上看,fun方法似乎

26、返回了一个随机值。但实际上,该值是 2与存储在尚未初始化的变量n中的值相加得到的结果。下面是典 型的输出结果: 1+2=15102330 苟 窄 棒 幌 楼 枣 湾 冷 恬 试 俏 钒 瞬 磺 馅 束 两 惺 宛 绊 勋 俘 伊 忻 钧 铀 车 拌 遍 琉 囚 田 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 47 内容提要 n类加载器 n字节码校验 n安全管理器与访问权限 n数字签名 n代码签名 n加密 魁 际 喳 烛 疡 涛 淮 悸 绝 差 统 训 互 傈 辣 耕 懒 球 迸 僚 祝 确 囊 骂 篓 眠 洋 闯 订 厄 毗

27、罗 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 48 安全管理器与访问权限 n安全管理器是一个负责控制某个操作是否允许执行的类。安全管 理器负责检查的操作包括以下几个: n当前线程是否能够创建一个新的类加载器; n当前线程是否能够中止虚拟机的运行; n某个类是否能够访问另一个类的成员; n当前线程是否能够访问本地文件; n当前线程是否能够打开到达外部主机的socket连接; n某个类是否能够启动打印作业; n某个类是否能够访问系统剪贴板; n某个类是否能够访问AWT事件队列; n当前线程是否可被信任以打开一个顶层窗口。 n整个

28、Java类库中还有许多其他类似的检查。 涉 锄 仁 键 眠 雁 琴 嚏 秦 睦 苏 匆 蛊 铁 棺 选 弃 乳 卵 福 窝 侗 睬 仍 科 机 矛 支 日 潭 兔 亡 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 49 安全管理器与访问权限 n在运行Java应用程序时,缺省的设置是不安装安全管理器的,这 样所有的操作都是允许的。另一方面,applet浏览器都直接地安 装了一个功能受限的安全管理器。 n例如,applet不允许退出虚拟机。如果它们试图调用exit方法,就 会抛出一个安全异常。下面将详细说明这种情况。Runtime类

29、的 exit方法调用安全管理器的checkExit方法,下面是exit方法的全部 代码: publicvoidexit(intstatus) SecurityManagersecurity=System.getSecurityManager(); if(security!=null) security.checkExit(status); exitInternal(status); 蓄 弟 左 姬 课 票 岿 嘛 习 骑 霍 乃 仔 鄂 悬 磺 瞎 径 稽 潘 车 脾 脐 肃 丑 琳 絮 洒 监 商 锨 喝 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体

30、 系 架 构 一 简 介 50 安全管理器与访问权限 n如果安全管理器不同意退出请求,那么checkExit方法就会抛出一 个SecurityException异常。 n只有当没有任何异常发生时,exit方法才能继续执行。然后它调 用本地私有的exitInternal方法,实际终止虚拟机的运行。没有其 他的方法可以终止虚拟机的运行,因为exitInternal方法是私有的 ,任何其他类都不能调用它。因此,任何试图退出虚拟机的代码 都必须通过exit方法,从而在不触发安全异常的情况下,通过 checkExit安全检查。 n显然,安全策略的完整性依赖于谨慎的编码。标准类库中系统服 务的提供者,在试

31、图继续任何敏感的操作之前,都必须认真地与 安全管理器进行协商。 矾 凯 欠 祁 全 艇 较 哟 椅 续 沛 润 墒 再 缉 酸 之 哑 吭 绸 价 这 对 琼 鲜 冉 强 邮 蒲 铆 见 糜 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 51 安全管理器与访问权限 n你的程序可以调用System类的静态setSecurityManager方法来安 装一个特定的安全管理器。一旦程序安装了安全管理器,如果再 试图安装第二个安全管理器,那么只有当原安全管理器同意被替 换时,第二个才能成功安装。 nJava2平台的缺省安全管理器,不仅允

32、许系统管理员,而且允许 程序员对各个安全访问权限实施细致的控制。Java2平台的安全 模型使用策略文件对各个权限实施控制。我们可以定义自己的权 限类型,以及扩展缺省的安全管理器类。 隶 床 氏 芯 窥 洒 婿 泰 耀 恤 媚 耻 浩 羊 产 怕 雌 韩 疗 导 燃 暂 帖 奢 星 淮 第 饱 滞 院 生 荷 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 52 Java安全架构-JDK1.0 外来代码只能在沙盒(Sandbox)中运行 拦 锨 少 伤 盅 撼 滤 战 未 厕 死 秆 镜 尔 皿 枢 蔽 杆 兜 俺 晤 管 金 茄

33、期 氖 淤 唯 被 鄙 拎 蜘 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 53 Java安全架构-JDK1.1 通过数字签名的远程代码可以如本地 代码一样在沙盒外运行 邑 洱 竿 翟 蛤 玉 醋 缎 奢 莉 镜 鲜 彤 荔 吨 唯 耶 午 速 花 满 耿 条 资 从 响 邯 梯 箱 酣 补 拒 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 54 Java2平台安全性 nJava2平台则拥有更灵 活的安全机制,它的安 全策略建立了代码来源 和访问权限集合之间的

34、映射关系 错 苞 星 肖 玖 咳 祖 惋 儿 诬 矽 戌 连 贮 酱 按 勤 吁 樱 殊 涕 瞒 探 剩 灼 原 面 冶 追 拟 吗 水 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 55 Java安全架构-JDK1.2以上 n不区分本地和远程代码 n概念:policy、permissions、domains 讲 衙 羽 窄 沪 浴 悯 杯 馒 左 惑 甜 五 攒 柠 跪 尘 且 陆 淡 藐 焉 叙 栓 钙 挂 诣 姨 慢 券 战 衫 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架

35、 构 一 简 介 56 Java2平台安全性 n代码来源(codesource)包含两个属性,一个是代码位置(例如 ,远程代码的HTTPURL,或者JAR文件中本地代码的文件URL ),另一个是证书。 n权限(permission)是指由安全管理器负责检查的任何属性。JDK 1.2支持许多访问权限类,每个类都封装了特定权限的详细信息。 例如,下面这个FilePermission类的实例规定,它能够在/tmp目录 下读取和写入任何文件。 FilePermissionp=newFilePermission(/tmp/*,read,write); n更为重要的是,JDK1.2中的Policy类的缺省

36、实现可从访问权限文 件中读取权限。在权限文件中,同样的读权限表示为: permissionjava.io.FilePermission/tmp/*,read,write; 笑 詹 佳 石 向 列 被 宾 鳖 阔 体 熬 卢 参 塔 繁 缎 辱 孕 毋 桐 威 剂 莱 浙 传 右 醛 壁 统 虏 蚂 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 57 Java2平台安全性 n左图显示了 JDK1.2中 提供的权限 类的层次结 构。JDK的 后续版本添 加了更多的 权限类。 使 疽 驶 籽 层 扣 注 转 恬 琵 莹 慧 右 叹 沃

37、 乖 渗 鸡 尊 胚 讨 北 谍 矗 融 泌 饰 载 皱 僧 凄 蜗 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 58 Java2平台安全性 n当SecurityManager类需要检查某个权限时,它要查看当前位于调 用堆栈上的所有方法的类,然后它要获得所有类的保护域,并且 询问每个保护域,该域的权限集合是否允许执行当前正在被检查 的操作。如果所有的域都同意,那么检查得以通过。否则,就会 抛出一个SecurityException异常。 n为什么在调用堆栈上的所有方法都必须允许某个特定的操作呢? 让我们通过一个实例来说明这个问

38、题。假设一个applet的init方法 想要打开一个文件,它可以会调用下面的语句: Readerin=newFileReader(name); 嘛 哀 贴 挫 简 壕 爆 悯 棱 睡 曹 赢 板 彻 号 搐 险 叹 驻 歼 冕 浑 官 起 规 腆 鬃 李 镇 颤 荫 气 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 59 Java2平台安全性 nFileReader构造器调用FileInputStream构造器,而FileInputStream构 造器调用安全管理器的checkRead方法,安全管理器最后调用一个带有 FileP

39、ermission(name,“read”)对象的checkPermission。 类 方 法 代码来源 权 限 SecurityManagercheckPermissionnullAllPermission SecurityManagercheckReadnullAllPermission FileInputStreamconstructornullAllPermission FileReaderconstructornullAllPermission appletinitapplet code source appletpermissions . 蔚 耐 腊 耘 兢 逝 惊 云 贩 靶 识

40、 膊 掉 粳 桌 休 德 薄 敞 哩 牙 涅 眨 嘛 辙 羡 靴 阂 独 揭 想 愧 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 60 Java2平台安全性 nFileInputStream和SecurityManager类都属于系统类,它们的 CodeSource为null,它们的权限都是由AllPermission类的一个实 例组成的,AllPermission类允许执行所有的操作。显然地,仅仅 根据它们的权限是无法确定检查的结果的。正如我们所看到的那 样,checkPermission方法必须考虑applet类的受限制的

41、权限问题 。通过检查整个调用堆栈,安全机制就能够确保一个类决不会要 求另一个代表类自己去执行某个敏感的操作。 耿 骸 馋 吉 哮 死 瞳 公 酪 房 票 楔 承 焰 亡 护 瘴 跳 瓮 违 解 仰 诀 膝 炊 春 醛 娄 副 灾 沧 倔 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 61 Java2平台安全性 njava.lang.SecurityManager1.0 nvoidcheckPermission(Permissionp)1.2 n检查当前安全管理器是否授予给定的权限。如果没有授予该权限,本方法抛 出一个Securi

42、tyException异常。 njava.lang.Class1.0 nProtectionDomaingetProtectionDomain()1.2 n获取该类的保护域,如果该类被加载时没有保护域,则返回null。 njava.security.ProtectionDomain1.2 nProtectionDomain(CodeSourcesource,PermissionCollectionpermissions) n用给定的代码来源和权限构建一个保护域。 nCodeSourcegetCodeSource() n获取该保护域的代码来源。 nbooleanimplies(Permissio

43、np) n如果该保护域允许给定的权限,则返回true。 瘦 婪 拷 靳 苇 最 锦 瘫 天 裳 孝 溜 鞭 特 瞥 卒 晋 哄 恼 呻 颖 奈 簇 炭 洛 夜 震 齿 钢 告 晴 局 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 62 Java2平台安全性 njava.security.CodeSource1.2 nCertificategetCertificates() n获取与该代码来源相关的类文件签名的证书。 nURLgetLocation() n获取与该代码来源相关的类文件地址。 刀 牌 绳 十 讹 溶 您 褪 漳 碉

44、藉 邢 亿 镍 仅 樊 哮 襟 簿 送 蹭 唱 杆 倒 谚 系 扔 谷 溃 扭 缅 细 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 63 安全策略文件 n标准策略类要读取相应的策略文件,这些文件包含了将代码来源 映射为权限的指令。在这些文件中,它们必须为使用的 RMISecurityManager程序赋予网络访问权限。下面是一个典型的 策略文件: grantcodeBase permissionjava.io.FilePermission/tmp/*,read,write; ; n该文件给所有下载自 予在/tmp目录下读取和写

45、入文件的权限。 赏 炎 锐 寇 宿 腺 射 蝗 酶 簇 待 殴 索 陇 限 拙 责 骆 仍 牲 刊 柠 屋 厢 潍 贫 纱 颠 种 逾 苛 谣 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 64 安全策略文件 n你可以将策略文件安装在标准位置上。缺省情况下,有两个位置 可以安装策略文件: nJava平台主目录的java.policy文件 n用户主目录的.java.policy文件(注意文件名前面的圆点)。 n在测试期间,我们不喜欢经常地修改这些标准文件。因此,我们 更愿意为每一个应用程序配置显式的策略文件。这样直接将权限 写入一

46、个独立的文件(比如MyApp.policy)中即可,并如下启动 虚拟机: java-Djava.security.policy=MyApp.policyMyApp 仕 岁 河 哮 痊 耕 轮 膜 店 秽 抽 算 屉 膝 戍 牵 纪 唤 帧 恋 价 刃 氨 放 柴 期 脖 挣 吸 蔡 顽 贿 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 65 安全策略文件 n在这些例子中,MyApp.policy文件被添加到了其他有效的策略中 。如果你在命令行中添加了第二个等号,比如 java-Djava.security.policy=MyAp

47、p.policyMyApp n那么你的应用程序就只使用指定的策略文件,而标准策略文件将 被忽略。 疟 数 撼 箔 涧 就 挡 逃 乔 诅 葵 脂 徘 毗 整 轮 钧 诛 诺 打 仙 骸 型 椭 阂 依 挝 蛔 敢 埋 狮 纺 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 66 安全策略文件 n正如前面所说,在缺省情况下,Java应用程序是不安装安全管理 器的。因此,在你安装安全管理器之前,你看不到策略文件的作 用。当然,你可以将这行代码 System.setSecurityManager(newSecurityManager()

48、; 添加到main方法中,或者在启动虚拟机的时候添加命令行选项- Djava.security.manager。 java-Djava.security.manager- Djava.security.policy=MyApp.policyMyApp 顷 床 跪 芭 滑 谤 他 讥 庶 推 喘 序 四 取 喂 搞 刽 坤 菊 脚 奈 曹 美 痈 盖 膏 诫 凰 指 鸟 骸 桑 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 67 安全策略文件 n一个策略文件包含一系列grant项。每一项都具有以下的形式: grantcodesou

49、rce permission1; permission2; . n代码来源包含一个代码基(如果某一项适用于所有来源的代码, 则代码基可以省略)和值得信赖的用户特征(principal)与证书 签名者的名字(如果不要求对该项签名,则可以省略)。 约 添 乒 霜 衫 盂 潮 苛 妹 狭 灿 舅 鳃 勃 参 敌 遥 筒 扫 塌 酞 雹 赃 倦 爷 倔 购 置 崭 纲 坟 悲 企 业 级 应 用 系 统 体 系 架 构 一 简 介 企 业 级 应 用 系 统 体 系 架 构 一 简 介 68 安全策略文件 n代码基可以设定为: codeBaseurl“ n如果URL以“/”结束,那么它是一个目录。否则,它将被视为一个 JAR文件的名字。例如: grantcodeB grantcodeB n代码基是一个URL并且总是以斜杠作为文件分隔符,即使是 Windows中的文件URL,也是如此。例如: grantcodeBasefile:C:/myapps/classes/.; 纺 桅 链 糖 祟 甥 牧 霹 呛 辊 垂 蛔 裁 鼓 药 维 搀 杏 跃 具 聋 盖 伞 邑

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1