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

上传人:本田雅阁 文档编号:3190583 上传时间:2019-07-24 格式:PPT 页数:95 大小:1.01MB
返回 下载 相关 举报
企业级应用系统体系架构一简介.ppt_第1页
第1页 / 共95页
企业级应用系统体系架构一简介.ppt_第2页
第2页 / 共95页
企业级应用系统体系架构一简介.ppt_第3页
第3页 / 共95页
企业级应用系统体系架构一简介.ppt_第4页
第4页 / 共95页
企业级应用系统体系架构一简介.ppt_第5页
第5页 / 共95页
点击查看更多>>
资源描述

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

1、企业级应用系统体系架构(一 ) 简介 * 课程开设目的 n开设本课的目的就是要让软件学院的本科生能够构建 企业级分布式应用系统 n不但知道该如何做,并且还要知道为什么那样做,以 及如何才能做好 n与信息系统建模课程形成有机的集成,了解企业 应用系统从建模到设计实现的完整过程和方案 前导内容 n什么是企业应用系统 n中间件技术 n软件构件技术及其后继技术 nJava EE与.NET简介 nXML及其应用 n注解 n访问数据库-JDBC protected Class findClass(String name) throws ClassNotFoundException byte classBy

2、tes = null; try classBytes = loadClassBytes(name); 26 编写你自己的类加载器 catch (IOException e) throw new ClassNotFoundException(name); Class cl = defineClass(name, classBytes, 0, classBytes.length); if (cl = null) throw new ClassNotFoundException(name); return cl; /* Loads and decrypt the class file bytes.

3、param name the class name return an array with the class file bytes */ private byte loadClassBytes(String name) throws IOException 27 编写你自己的类加载器 String cname = name.replace(., /) + “.caesar“; FileInputStream in = null; in = new FileInputStream(cname); try ByteArrayOutputStream buffer = new ByteArray

4、OutputStream(); int ch; while (ch = in.read() != -1) byte b = (byte) (ch - key); buffer.write(b); in.close(); return buffer.toByteArray(); finally in.close(); 28 编写你自己的类加载器 private int key; n我们的Caesar密码版本使用的密钥是从1255之间的一个数字, 解密时,只需将密钥与每个字节相加,然后对256取余。 Caesar.java程序就实现了这种加密行为。 n为了不与通常的类加载器相混淆,我们对加密的类文

5、件使用了不 同的扩展名.caesar。 n解密时,类加载器只需要将每个字节减去该密钥即可。 29 编写你自己的类加载器 import java.io.*; /* Encrypts a file using the Caesar cipher. */ public class Caesar public static void main(String args) if (args.length != 3) System.out.println(“USAGE: java Caesar in out key“); return; try FileInputStream in = new FileIn

6、putStream(args0); FileOutputStream out = new FileOutputStream(args1); int key = Integer.parseInt(args2); 30 编写你自己的类加载器 int ch; while (ch = in.read() != -1) byte c = (byte)(ch + key); out.write(c); in.close(); out.close(); catch (IOException exception) exception.printStackTrace(); 31 编写你自己的类加载器 publi

7、c void runClass(String name, String key) try ClassLoader loader = new CryptoClassLoader(Integer.parseInt(key); Class c = loader.loadClass(name); String args = new String ; Method m = c.getMethod(“main“, args.getClass(); m.invoke(null, (Object) args); catch (Throwable e) JOptionPane.showMessageDialog

8、(this, e); 32 编写你自己的类加载器 n对类文件进行加密有很大的用途(当然,使用的密码的强度应该 高于Caesar密码),如果没有加密密钥,类文件就毫无用处。它 们既不能由标准虚拟机来执行,也不能轻易地被反汇编。 n这就是说,你可以使用定制的类加载器来认证类用户的身份,或 者确保程序在运行之前已经支付了软件费用。当然,加密只是定 制类加载器的应用之一。你可以使用其他类型的加载器来解决别 的问题,例如,将类文件存储到数据库中。 33 编写你自己的类加载器 njava.lang.Class 1.0 nClassLoader getClassLoader() n获取加载该类的类加载器。

9、njava.lang.ClassLoader 1.0 nClassLoader getParent() 1.2 n返回父类加载器,如果父类加载器是引导类加载器,则返回null。 nstatic ClassLoader getSystemClassLoader() 1.2 n获取系统类加载器,即用于加载第一个应用类的类加载器。 nprotected Class findClass(String name) 1.2 n类加载器应该覆盖该方法,以查找类的字节码,并通过调用 defineClass方法将字节码传给虚拟机。 n参数: nname类名; 使用 . 作为包名分隔符,并且不使用.class 后

10、缀 34 编写你自己的类加载器 nClass defineClass(String name, byte data, int offset, int length) n将一个新的类添加到虚拟机中。 n参数: nname类名; 使用 . 作为包名分隔符,并且不使用.class 后缀 ndata用于存放该类字节码的数组 noffset数组中字节码的起始位置 nlength数组中字节码的长度 njava.lang.Thread 1.0 nClassLoader getContextClassLoader() 1.2 n获取类加载器,该线程的创建者将其指定为执行该线程时最适合使 用的类加载器。 nvo

11、id setContextClassLoader(ClassLoader loader) 1.2 n为该线程中的代码设置一个类加载器,以获取要加载的类。如果在 启动一个线程时没有显式地设置上下文类加载器,则使用父线程的 上下文类加载器。 35 内容提要 n类加载器 n字节码校验 n安全管理器与访问权限 n数字签名 n代码签名 n加密 36 字节码校验 n当类加载器将新加载的Java平台类的字节码传递给虚拟机时,这 些字节码首先要接受“校验器(verifier)”的校验。校验器负责检 查那些指令无法执行的明显有破坏性的操作。除了系统类外,所 有的类都要被校验,不过,你可以使用非正式的-nover

12、ify选项来 钝化校验。 n例如,你可以使用下面的命令行: java -noverify Hello 37 字节码校验 n下面是校验器执行的一些检查: n变量要在使用之前进行初始化。 n方法调用与对象引用类型之间要匹配。 n访问私有数据和方法的规则没有被违反。 n对本地变量的访问都在运行时堆栈内。 n运行时堆栈没有溢出。 n如果以上这些检查中任何一条没有通过,那么该类就被认为遭到 了破坏,并且不予加载。 38 字节码校验 n这种严格的校验是出于安全上的考虑 n通过修改运行时堆栈中的值,或者向系统对象的私有数据字 段写入数据,某个程序就会突破浏览器的安全防线。 n用Java语言编译器生成的类文件

13、总是可以通过校验的。 n校验器总是在防范被故意篡改的类文件,而不仅仅只是检查 编译器产生的类文件。 39 字节码校验 n下面的例子将展示如何创建一个变动过的类文件。我们从示例程 序VerifierTest.java开始。这是一个简单的程序,它调用一个方法 ,并且显示方法的运行结果。该程序既可以在控制台运行,也可 以作为一个Applet程序来运行。其中的fun方法本身只是负责计算 1+2。 static int fun() int m; int n; m = 1; n = 2; int r = m + n; return r; 40 字节码校验 n作为一次实验,请尝试编译下面这个对该程序进行修改

14、后的文件 。 static int fun() int m = 1; int n; m = 1; m = 2; int r = m + n; return r; 41 字节码校验 n在这种情况下,n没有被初始化,它可以是任何随机值。当然, 编译器能够检测到这个问题并拒绝编译该程序。如果要建立一个 不良的类文件,我们必须得多花点功夫。首先,运行javap程序, 以便知晓编译器是如何翻译fun方法的。下面这个命令 javap -c VerifierTest n用助记(mnemonic)格式显示了类文件中的字节码。 42 字节码校验 Method int fun() 0 iconst_1 1 ist

15、ore_0 2 iconst_2 3 istore_1 4 iload_0 5 iload_1 6 iadd 7 istore_2 8 iload_2 9 ireturn 43 字节码校验 n我们使用一个十六进制编辑器将指令3从istore_1改为istore_0,也 就是说,局部变量0(即m)被初始化了两次,而局部变量1(即n )则根本没有初始化。 0 iconst_1 04 1 istore_0 3B 2 iconst_2 05 3 istore_1 3C 4 iload_0 1A 5 iload_1 1B 6 iadd 60 7 istore_2 3D 8 iload_2 1C 9 ir

16、eturn AC 44 字节码校验 n你可以使用十六进制编辑器 (例如DataWorkshop,可以 从 http:/www.dataworkshop.de 处下载)来进行修改操作。 当然,你也可以使用hexl- mode的emacs进行修改。在 左图中,你可以看到类文件 VerifierTest.class被加载到了 DataWorkshop编辑器中, fun方法的字节码已经被选定 。 45 字节码校验 n将3C改为3B并保存类文件。然后设法运行VerifierTest程序。你 将会看到下面的出错信息: Exception in thread “main“ java.lang.VerifyE

17、rror: (class: VerifierTest, method:fun signature: ()I) Accessing value from uninitialized register 1 n这很好,虚拟机发现了我们所做的修改。 46 字节码校验 n现在用-noverify选项(或者-Xverify:none)来运行程序: java -noverify VerifierTest n从表面上看,fun方法似乎返回了一个随机值。但实际上,该值是 2与存储在尚未初始化的变量n中的值相加得到的结果。下面是典 型的输出结果: 1 + 2 = 15102330 47 内容提要 n类加载器 n字

18、节码校验 n安全管理器与访问权限 n数字签名 n代码签名 n加密 48 安全管理器与访问权限 n安全管理器是一个负责控制某个操作是否允许执行的类。安全管 理器负责检查的操作包括以下几个: n当前线程是否能够创建一个新的类加载器; n当前线程是否能够中止虚拟机的运行; n某个类是否能够访问另一个类的成员; n当前线程是否能够访问本地文件; n当前线程是否能够打开到达外部主机的socket连接; n某个类是否能够启动打印作业; n某个类是否能够访问系统剪贴板; n某个类是否能够访问AWT事件队列; n当前线程是否可被信任以打开一个顶层窗口。 n整个Java类库中还有许多其他类似的检查。 49 安全

19、管理器与访问权限 n在运行Java应用程序时,缺省的设置是不安装安全管理器的,这 样所有的操作都是允许的。另一方面,applet浏览器都直接地安 装了一个功能受限的安全管理器。 n例如,applet不允许退出虚拟机。如果它们试图调用exit方法,就 会抛出一个安全异常。下面将详细说明这种情况。Runtime类的 exit方法调用安全管理器的checkExit方法,下面是exit方法的全部 代码: public void exit(int status) SecurityManager security = System.getSecurityManager(); if (security !=

20、 null) security.checkExit(status); exitInternal(status); 50 安全管理器与访问权限 n如果安全管理器不同意退出请求,那么checkExit方法就会抛出一 个SecurityException异常。 n只有当没有任何异常发生时,exit方法才能继续执行。然后它调 用本地私有的exitInternal方法,实际终止虚拟机的运行。没有其 他的方法可以终止虚拟机的运行,因为exitInternal方法是私有的 ,任何其他类都不能调用它。因此,任何试图退出虚拟机的代码 都必须通过exit方法,从而在不触发安全异常的情况下,通过 checkExit

21、安全检查。 n显然,安全策略的完整性依赖于谨慎的编码。标准类库中系统服 务的提供者,在试图继续任何敏感的操作之前,都必须认真地与 安全管理器进行协商。 51 安全管理器与访问权限 n你的程序可以调用System类的静态setSecurityManager方法来安 装一个特定的安全管理器。一旦程序安装了安全管理器,如果再 试图安装第二个安全管理器,那么只有当原安全管理器同意被替 换时,第二个才能成功安装。 nJava 2 平台的缺省安全管理器,不仅允许系统管理员,而且允许 程序员对各个安全访问权限实施细致的控制。Java 2 平台的安全 模型使用策略文件对各个权限实施控制。我们可以定义自己的权

22、限类型,以及扩展缺省的安全管理器类。 52 Java安全架构-JDK1.0 外来代码只能在沙盒(Sandbox)中运行 53 Java安全架构-JDK1.1 通过数字签名的远程代码可以如本地 代码一样在沙盒外运行 54 Java 2 平台安全性 nJava 2 平台则拥有更灵 活的安全机制,它的安 全策略建立了代码来源 和访问权限集合之间的 映射关系 55 Java安全架构-JDK1.2以上 n不区分本地和远程代码 n概念:policy、permissions、domains 56 Java 2 平台安全性 n代码来源(code source)包含两个属性,一个是代码位置(例如 ,远程代码的H

23、TTP URL,或者JAR文件中本地代码的文件URL ),另一个是证书。 n权限(permission)是指由安全管理器负责检查的任何属性。JDK 1.2 支持许多访问权限类,每个类都封装了特定权限的详细信息。 例如,下面这个FilePermission类的实例规定,它能够在/tmp目录 下读取和写入任何文件。 FilePermission p = new FilePermission(“/tmp/*“, “read,write“); n更为重要的是,JDK 1.2中的Policy类的缺省实现可从访问权限文 件中读取权限。在权限文件中,同样的读权限表示为: permission java.io

24、.FilePermission “/tmp/*“, “read,write“; 57 Java 2 平台安全性 n左图显示了 JDK 1.2中 提供的权限 类的层次结 构。JDK的 后续版本添 加了更多的 权限类。 58 Java 2 平台安全性 n当SecurityManager类需要检查某个权限时,它要查看当前位于调 用堆栈上的所有方法的类,然后它要获得所有类的保护域,并且 询问每个保护域,该域的权限集合是否允许执行当前正在被检查 的操作。如果所有的域都同意,那么检查得以通过。否则,就会 抛出一个SecurityException异常。 n为什么在调用堆栈上的所有方法都必须允许某个特定的操

25、作呢? 让我们通过一个实例来说明这个问题。假设一个applet的init方法 想要打开一个文件,它可以会调用下面的语句: Reader in = new FileReader(name); 59 Java 2 平台安全性 nFileReader构造器调用FileInputStream构造器,而FileInputStream构 造器调用安全管理器的checkRead方法,安全管理器最后调用一个带有 FilePermission(name, “read”)对象的checkPermission。 类 方 法 代码来源 权 限 SecurityManager checkPermission null

26、AllPermission SecurityManagercheckReadnull AllPermission FileInputStreamconstructornullAllPermission FileReader constructor null AllPermission applet init applet code source applet permissions . . . 60 Java 2 平台安全性 nFileInputStream 和 SecurityManager类都属于系统类,它们的 CodeSource为null,它们的权限都是由AllPermission类的

27、一个实 例组成的,AllPermission类允许执行所有的操作。显然地,仅仅 根据它们的权限是无法确定检查的结果的。正如我们所看到的那 样,checkPermission方法必须考虑applet类的受限制的权限问题 。通过检查整个调用堆栈,安全机制就能够确保一个类决不会要 求另一个代表类自己去执行某个敏感的操作。 61 Java 2 平台安全性 njava.lang.SecurityManager 1.0 nvoid checkPermission(Permission p) 1.2 n检查当前安全管理器是否授予给定的权限。如果没有授予该权限,本方法抛 出一个SecurityExceptio

28、n异常。 njava.lang.Class 1.0 nProtectionDomain getProtectionDomain() 1.2 n获取该类的保护域,如果该类被加载时没有保护域,则返回null。 njava.security.ProtectionDomain 1.2 nProtectionDomain(CodeSource source, PermissionCollection permissions) n用给定的代码来源和权限构建一个保护域。 nCodeSource getCodeSource() n获取该保护域的代码来源。 nboolean implies(Permission

29、 p) n如果该保护域允许给定的权限,则返回true。 62 Java 2 平台安全性 njava.security.CodeSource 1.2 nCertificate getCertificates() n获取与该代码来源相关的类文件签名的证书。 nURL getLocation() n获取与该代码来源相关的类文件地址。 63 安全策略文件 n标准策略类要读取相应的策略文件,这些文件包含了将代码来源 映射为权限的指令。在这些文件中,它们必须为使用的 RMISecurityManager程序赋予网络访问权限。下面是一个典型的 策略文件: grant codeBase “http:/ per

30、mission java.io.FilePermission “/tmp/*“, “read,write“; ; n该文件给所有下载自http:/ 予在/tmp目录下读取和写入文件的权限。 64 安全策略文件 n你可以将策略文件安装在标准位置上。缺省情况下,有两个位置 可以安装策略文件: nJava平台主目录的java.policy文件 n用户主目录的.java.policy文件(注意文件名前面的圆点)。 n在测试期间,我们不喜欢经常地修改这些标准文件。因此,我们 更愿意为每一个应用程序配置显式的策略文件。这样直接将权限 写入一个独立的文件(比如MyApp.policy)中即可,并如下启动 虚

31、拟机: java -Djava.security.policy=MyApp.policy MyApp 65 安全策略文件 n在这些例子中,MyApp.policy文件被添加到了其他有效的策略中 。如果你在命令行中添加了第二个等号,比如 java -Djava.security.policy=MyApp.policy MyApp n那么你的应用程序就只使用指定的策略文件,而标准策略文件将 被忽略。 66 安全策略文件 n正如前面所说,在缺省情况下,Java应用程序是不安装安全管理 器的。因此,在你安装安全管理器之前,你看不到策略文件的作 用。当然,你可以将这行代码 System.setSecur

32、ityManager(new SecurityManager(); 添加到main方法中,或者在启动虚拟机的时候添加命令行选项- Djava.security.manager。 java -Djava.security.manager - Djava.security.policy=MyApp.policy MyApp 67 安全策略文件 n一个策略文件包含一系列grant项。每一项都具有以下的形式: grant codesource permission1; permission2; . . . n代码来源包含一个代码基(如果某一项适用于所有来源的代码, 则代码基可以省略)和值得信赖的用户特

33、征(principal)与证书 签名者的名字(如果不要求对该项签名,则可以省略)。 68 安全策略文件 n代码基可以设定为: codeBase “url“ n如果URL以“/”结束,那么它是一个目录。否则,它将被视为一个 JAR文件的名字。例如: grant codeBase “ . . . ; grant codeBase “ . . . ; n代码基是一个URL并且总是以斜杠作为文件分隔符,即使是 Windows中的文件URL,也是如此。例如: grant codeBase “file:C:/myapps/classes/“ . . . ; 69 安全策略文件 n权限采用下面的结构: pe

34、rmission className targetName, actionList; n类名是权限类的全称类名(比如java.io.FilePermission)。目标名 是个特定的权限值,例如,用于文件权限的目录名或者文件名, 或者是用于socket权限的主机和端口。操作列表同样是与特定权 限相关的,它是一个操作方式的列表,比如read或者connect等操 作,用逗号分隔。有些权限类不需要目标名和操作列表。 70 安全策略文件 权限 目标 操作 java.io.FilePermission 文件目标 read, write, execute, delete .SocketPermissio

35、n Socket 目标accept, connect, listen, resolve java.util.PropertyPermission 属性目标 read, write java.lang.RuntimePermission createClassLoader getClassLoader setContextClassLoader enableContextClassLoaderOve rride createSecurityManager setSecurityManager exitVM 71 安全策略文件 n正如上表所示,大部分 权限只允许执行某个特 定的操作。你可以将操 作

36、视为带有一个隐含操 作“permit”的目标。这 些权限类都继承自 BasicPermission类。然 而,文件、socket和属 性权限的目标都比较复 杂,我们必须对它们进 行详细介绍。 n文件权限的目标可以有 右面几种形式: file文件 directory/ 目录 directory/* 目录中的所有文件 * 当前目录中的所有文件 directory/- 目录或者它的子目录中 的所有文件 - 当然目录或者它的子目 录中所有文件 文件系统中的所有文件 72 安全策略文件 n例如,下面的权限项赋予对/myapp目录和它的子目录中的所有文 件的访问权限。 permission java.io

37、.FilePermission “/myapp/-“, “read,write,delete“; n必须使用转义字符序列来表示Window文件名中的反斜杠。 permission java.io.FilePermission “c:myapp-“, “read,write,delete“; 73 安全策略文件 nSocket权限的目标 由主机和端口范围 组成。对主机的描 述具有右面几种形 式: hostname 或 IPaddress 单个主机 localhost 或空字符串 本地主机 *.domainSuffix 以给定后缀结尾的 域中所有的主机 * 所有主机 74 安全策略文件 n端口范围

38、是可 选的,具有下 面几种形式: :n单个端口 :n-编号大于等于n的所有端口 :-n 编号小于等于n的所有端口 :n1-n2 位于给定范围内的所有端口 75 安全策略文件 n下面是一个权限的实例: permission .SocketPermission “*:8000- 8999”, “connect”; n最后,属性权限的目标可以采用下面两种形式之一: property一个特定的属性 propertyPrefix.*带有给定前缀的所有属 性 76 安全策略文件 n“java.home” 和 “java.vm.*”就是这样的例子。 n例如,下面的权限项允许程序读取以java.vm开头的所有

39、属性。 permission java.util.PropertyPermission “java.vm.*“, “read“; n你可以在策略文件中使用系统属性。$property标记表示一个属 性值。例如,$user.home表示用户的主目录。下面是在访问权 限项中使用系统属性的典型应用。 permission java.io.FilePermission “$user.home“, “read,write“; 77 安全策略文件 n为了创建平台无关的策略文件,使用file.separator属性而不是使 用显式的/或者分隔符绝对是个好主意。如果要使它更加简单, 可以使用符号$/作为$fi

40、le.separator的缩写。例如, permission java.io.FilePermission “$user.home$/-“, “read,write“; 是一个可移植的项,用于授予对在用户的主目录及其子目录中的 文件进行读写的权限。 78 安全策略文件 n一个简单的示例: 1、GetProps.java class GetProps public static void main(String args) String s; try s = System.getProperty(“java.version“, “not specified“); System.out.print

41、ln(“ The version of your Java is: “ + s); s = System.getProperty(“os.name“, “not specified“); System.out.println(“ The name of your os is: “ + s); s = System.getProperty(“java.home“, “not specified“); System.out.println(“ Your JRE directory is: “ + s); catch (Exception e) System.err.println(“Caught

42、exception “ + e.toString(); 79 安全策略文件 2、policy file grant permission java.util.PropertyPermission “java.version“, “read“; permission java.util.PropertyPermission “os.name“, “read“; permission java.util.PropertyPermission “java.home“, “read“; ; 3、java -Djava.security.manager - Djava.security.policy=G

43、etProps.policy GetProps 4、如果删除读取 java.home的 permission,则会抛出异常 80 定制权限 n在本节中,我们将要介绍如何把自己的权限类提供给用户,以使 得他们可以在策略文件中引用这些权限类。 n如果要实现自己的权限类,你可以继承Permission类,并提供以 下方法: n带有两个String参数的构造器,这两个参数分别是目标和操作 列表 nString getActions() nboolean equals() nint hashCode() nboolean implies(Permission other) 81 定制权限 n最后一个方法

44、是最重要的。权限有一个次序,其中更加通用的权 限隐含了更加具体的权限。请考虑下面的文件权限: p1 = new FilePermission(“/tmp/-“, “read, write“); n该权限允许读写/tmp目录以及子目录中的任何文件。 n该权限隐含了其他更加具体的权限: p2 = new FilePermission(“/tmp/-“, “read“); p3 = new FilePermission(“/tmp/aFile“, “read, write“); p4 = new FilePermission(“/tmp/aDirectory/-“, “write“); n换句话说,

45、如果 np1的目标文件集包含p2的目标文件集; np1的操作集包含p2的操作集。 n那么,文件访问权限p1就隐含了另一个文件访问权限p2。 82 定制权限 n请考虑下面关于implies方法的用法举例。当FileInputStream构造 器想要打开一个文件,以读取该文件时,它要检查它是否拥有操 作权限。如果要执行这种检查,就应将一个特定的文件权限对象 传递给checkPermission方法: checkPermission(new FilePermission(fileName, “read“); n现在安全管理器询问所有适用的权限是否隐含了该权限。如果其 中某个隐含了该权限,就通过了检查

46、。 n特别地,AllPermission隐含了其他所有的权限。 83 定制权限 n如果你定义了自己的权限类,那么你必须对权限对象定义一个合 适的隐含法则。例如,假设你为采用Java技术的机顶盒定义一个 TVPermission,那么下面这个访问权限 new TVPermission(“Tommy:2-12:1900-2200“, “watch,record“) n将允许Tommy在19点到22点之间对2至12频道的电视节目进行观 看和录像。你必须实现implies方法,以隐含像下面这样的特定权 限: new TVPermission(“Tommy:4:2000-2100“, “watch“)

47、84 实现权限类 n在下面这个示例程序中,我们实现了一个新的权限,用于监视将 文本插入到文本域的操作。该程序会确保你不能输入“不良单词” ,例如sex,drugs以及 C+等。我们使用一个定制的权限类,以 便在策略文件中提供这些不良单词。 n下面这个JTextArea的子类询问安全管理器是否准备好了去添加 新文本。 class WordCheckTextArea extends JTextArea public void append(String text) WordCheckPermission p = new WordCheckPermission(text, “insert“); Se

48、curityManager manager = System.getSecurityManager(); if (manager != null) manager.checkPermission(p); super.append(text); 85 实现权限类 n如果安全管理器赋予了WordCheckPermission权限,那么文本就 可以追加。否则,checkPermission方法就会抛出一个异常。 n单词检查权限有两个可能的操作,一个是insert(用于插入特定文 本的权限),另一个是avoid(添加任何文本到要避免的不良单词 列表中的权限)。你应该用下面的策略文件运行这个程序: grant permission WordCheckPermission “sex,drugs,C+“, “avoid“; ; n这个策略文件赋予的权限,可以插入除不良单词sex,drugs和 C+之外的任何文本。 86 实现权限类 n当设计WordCheckPermission类时,我们必须特别注意implies方 法,下面是控制权限p1是否隐含p2的规则: n如果p1有avoid操作,p2有insert操作,那么p2的目标必须避开 p1中的所有

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

当前位置:首页 > 其他


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