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

上传人:本田雅阁 文档编号:3254762 上传时间:2019-08-06 格式: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、企业级应用系统体系架构(一) 简介,2019/8/6,课程开设目的,开设本课的目的就是要让软件学院的本科生能够构建企业级分布式应用系统 不但知道该如何做,并且还要知道为什么那样做,以及如何才能做好 与信息系统建模课程形成有机的集成,了解企业应用系统从建模到设计实现的完整过程和方案,前导内容,什么是企业应用系统 中间件技术 软件构件技术及其后继技术 Java EE与.NET简介 XML及其应用 注解 访问数据库-JDBC&ADO.NET JavaBean构件 事务管理 消息管理 RMI与EJB EJB3.0中的会话Bean EJB3.0中的实体Bean EJB3.0中的消息驱动Bean,3,授课

2、主题与内容,本课授课17次,每次2学时,共34学时: 基于构件的分析与设计技术 安全控制、事务管理、消息机制、表示层开发技术 Web Services技术 Java EE中的Web Services .NET中的Web Services 基于RESTful的WS Web2.0技术 Ajax和Flex SOA技术 SOA 基础理论、面向服务的分析与设计、SOA实现方式举例 企业级应用系统体系架构的主要质量属性,以及实现对这些质量属性的要求可以采用的设计策略。,考核方式,课程大作业 该课程大作业将与信息系统建模课程的大作业统一 大作业以小组为单位完成 大作业考核将与信息系统建模课程一并进行,从不同

3、角度考核给分 部分大作业将与摩根史坦利合作 成绩构成 课程大作业中期检查20%,第11周周末(5月7-8日) 课程大作业期末验收50% 期末考试30%,闭卷笔试,助教与答疑,助教 王文婷 答疑 陈昊鹏:周三14:00-16:00 软件大楼1111 王文婷:周三14:00-16:00 软件大楼5402 摩根工程师:项目组协商,企业级应用系统体系架构(一) 架构特征,2019/8/6,What is Enterprise Application,Enterprise applications often have complex data - and lots of it - to work o

4、n, together with business rules that fail all tests of logical reasoning. Other terms for enterprise applications include “information systems“ Enterprise applications include payroll, patient records, shipping tracking, cost analysis, credit scoring, insurance, supply chain, accounting, customer se

5、rvice, and foreign exchange trading. Enterprise applications dont include automobile fuel injection, word processors, elevator controllers, chemical plant controllers, telephone switches, operating systems, compilers, and games.,What is Enterprise Application,Enterprise applications usually involve

6、persistent data usually have a lot of data usually many people access data concurrently usually have a lot of user interface screens usually they need to integrate with other enterprise applications scattered around the enterprise conceptual dissonance with the data complex business “illogic“,10,企业应

7、用系统的特征,一个企业系统是具备下列性质的系统: 共享某些或全部在应用中被使用的资源 规划成为内部使用 必须在现有的架构内运行 将由内部IT员工部署并提供支持 需要更强的健壮性,对于异常处理和可扩展性都是如此 只能适度地失败 必须合理地处理系统随时间推移而发生的演化,Dimensions of software complexity,Higher technical complexity - Embedded, real-time, distributed, fault-tolerant - Custom, unprecedented, architecture reengineering -

8、 High performance,Lower technical complexity - Mostly 4GL, or component-based - Application reengineering - Interactive performance,Higher management complexity - Large scale - Contractual - Many stake holders - “Projects”,Lower management complexity - Small scale - Informal - Single stakeholder - “

9、Products”,An average software project - 5-10 people - 3-9 month duration - 3-5 external interfaces - Some unknowns & risks,Typical System Architecture,What is Software Architecture,Enterprise/Product Architecture,Business Architecture,Application Architecture,Technical Architecture,Product Architect

10、ure,Software Architecture Quality Metrics,Availability Reliability Modifiability Performance Security Testability Usability Supportability,Other factors to consider,Business objectives(T2M,Targeted Market) Skill of development team and local market of team Cost to build and Maintain v.s. Benefit Mat

11、eriality of Technology Current System constrain, integration Migration, migration, migration,Summary,Software Architecture need to consider from both technical point of view as well as business point of view There are different ways to communicate architecture design There is no THE best architectur

12、e for any one software system Always need consider external constrain, such cost, infrastructure, Maturity of IT organization, not only development, but also operations Architecture is a live entity, therefore, ability to grow, migrate is very important,16,企业级应用系统体系架构(一) 安全1,2019/8/6,From: Prentice.

13、Hall.PTR: Core Java 2 Volume II Advanced Features,8th.Edition. Apri.2008.,17,内容提要,类加载器 字节码校验 安全管理器与访问权限 数字签名 代码签名 加密,18,类加载器,Java编译器能够将源程序转化为假想机器的机器语言,这种机器称为虚拟机。解释器能够将虚拟机的指令集翻译成目标机器的机器语言。 请注意,虚拟机只加载程序执行时所需要的类文件。例如,假设程序从MyProgram.class开始运行,下面是虚拟机执行的步骤: 虚拟机有一个用于加载类文件的机制,例如,从磁盘上读取文件或者请求web上的文件;它使用该机制来加

14、载MyProgram类文件中的内容。 如果MyProgram类拥有类型为另一个类的实例变量,或者是拥有超类,那么这些类文件也会被加载。(加载某个类所依赖的所有类的过程称为类的解析。) 接着,虚拟机执行MyProgram中的main方法(它是静态的,无需创建类的实例)。 如果main方法或者main调用的方法要用到更多的类,那么接下来就会加载这些类。,19,类加载器,然而,类加载机制并非只使用单个的类加载器。每个Java程序至少拥有三个类加载器: 引导类加载器 扩展类加载器 系统类加载器(有时也称为应用类加载器),20,类加载器,引导类加载器负责加载系统类(通常从JAR文件rt.jar中进行加载

15、)。它是虚拟机整体中的一部分,而且通常是用C语言来实现的。引导类加载器没有对应的ClassLoader对象,例如,该方法 String.class.getClassLoader() 将返回null。 扩展类加载器用于从jre/lib/ext目录加载“标准的扩展”。你可以将JAR文件放入该目录,这样即使没有任何类路径,扩展类加载器也可以找到其中的各个类。 系统类加载器用于加载应用类。它在由CLASSPATH环境变量或者-classpath命令行选项设置的类路径中的目录里或者是JAR/ZIP文件里查找这些类。 在Sun公司的Java语言实现中,扩展类加载器和系统类加载器都是用Java来实现的。它们

16、都是URLClassLoader类的实例。,21,类加载器,类加载器有一种“父子”关系。除了引导类加载器外,每个类加载器都有一个父类加载器。根据规定,类加载器会为它的父类加载器提供一个机会,以便加载任何给定的类,并且只有在其父类加载器加载失败时,它才会加载该给定类。例如,当要求系统类加载器加载一个系统类(比如,java.util.ArrayList)时,它首先要求扩展类加载器进行加载,该扩展类加载器则首先要求引导类加载器进行加载。引导类加载器查找并加载rt.jar中的这个类,而无须其他类加载器做更多的搜索。,22,将类加载器作为命名空间,每个Java程序员都知道,包的命名是为了消除名字冲突。在

17、标准类库中,有两个名为Date的类,它们的实际名字分别为java.util.Date和java.sql.Date。使用简单的名字只是为了程序员的方便,它们要求程序要包含恰当的import语句。在一个正在执行的程序中,所有的类名都包含它们的包名。 然而,令人惊奇的是,在同一个虚拟机中,可以有两个类,它们的类名和包名都是相同的。类是由它的全名和类加载器来确定的。这项技术在加载来自多处的代码时很有用。例如,浏览器为每一个web页都使用了一个独立的applet类加载器类的实例。这样,虚拟机就能区分来自不同web页的各个类,而不用管它们的名字是什么。,23,编写你自己的类加载器,如果要编写自己的类加载器

18、,你只需要继承ClassLoader类,然后覆盖下面这个方法 findClass(String className) ClassLoader超类的loadClass方法用于将类的加载操作委托给其父类加载器去进行,只有当该类尚未加载并且父类加载器也无法加载该类时,才调用findClass方法。 如果要实现该方法,你就必须: 为来自本地文件系统或者其他来源的类加载其字节码。 调用ClassLoader超类的defineClass方法,向虚拟机提供字节码。,24,编写你自己的类加载器,我们建立了一个类加载器,用于加载加密过的类文件。该程序要求用户输入第一个要加载的类的名字(即包含main方法的类)和

19、密钥。然后,使用一个专门的类加载器来加载指定的类并调用main方法。该类加载器对指定的类和所有被其引用的非系统类进行解密。最后,该程序调用已加载类的main方法。,25,编写你自己的类加载器,class CryptoClassLoader extends ClassLoader /* Constructs a crypto class loader. param k the decryption key */ public CryptoClassLoader(int k) key = k; protected Class findClass(String name) throws ClassN

20、otFoundException byte classBytes = 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

21、decrypt the class file bytes. 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 ByteArrayOutp

22、utStream buffer = new ByteArrayOutputStream(); 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; 我们的Caesar密码版本使用的密钥是从1255之间的一个数字,解密时,只需将密钥与每个字节相加,然后对256取余。Caesar.java程序就实现了这种加

23、密行为。 为了不与通常的类加载器相混淆,我们对加密的类文件使用了不同的扩展名.caesar。 解密时,类加载器只需要将每个字节减去该密钥即可。,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 FileI

24、nputStream in = new FileInputStream(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.printStackTr

25、ace(); ,31,编写你自己的类加载器,public 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) JO

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

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

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

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

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

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

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

33、ad_1 6 iadd 7 istore_2 8 iload_2 9 ireturn,43,字节码校验,我们使用一个十六进制编辑器将指令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 ireturn AC,44,字节码校验,你可以使用十六进制编辑器(例如DataWorkshop,

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

35、sing value from uninitialized register 1 这很好,虚拟机发现了我们所做的修改。,46,字节码校验,现在用-noverify选项(或者-Xverify:none)来运行程序: java -noverify VerifierTest 从表面上看,fun方法似乎返回了一个随机值。但实际上,该值是2与存储在尚未初始化的变量n中的值相加得到的结果。下面是典型的输出结果: 1 + 2 = 15102330,47,内容提要,类加载器 字节码校验 安全管理器与访问权限 数字签名 代码签名 加密,48,安全管理器与访问权限,安全管理器是一个负责控制某个操作是否允许执行的类

36、。安全管理器负责检查的操作包括以下几个: 当前线程是否能够创建一个新的类加载器; 当前线程是否能够中止虚拟机的运行; 某个类是否能够访问另一个类的成员; 当前线程是否能够访问本地文件; 当前线程是否能够打开到达外部主机的socket连接; 某个类是否能够启动打印作业; 某个类是否能够访问系统剪贴板; 某个类是否能够访问AWT事件队列; 当前线程是否可被信任以打开一个顶层窗口。 整个Java类库中还有许多其他类似的检查。,49,安全管理器与访问权限,在运行Java应用程序时,缺省的设置是不安装安全管理器的,这样所有的操作都是允许的。另一方面,applet浏览器都直接地安装了一个功能受限的安全管理

37、器。 例如,applet不允许退出虚拟机。如果它们试图调用exit方法,就会抛出一个安全异常。下面将详细说明这种情况。Runtime类的exit方法调用安全管理器的checkExit方法,下面是exit方法的全部代码: public void exit(int status) SecurityManager security = System.getSecurityManager(); if (security != null) security.checkExit(status); exitInternal(status); ,50,安全管理器与访问权限,如果安全管理器不同意退出请求,那么c

38、heckExit方法就会抛出一个SecurityException异常。 只有当没有任何异常发生时,exit方法才能继续执行。然后它调用本地私有的exitInternal方法,实际终止虚拟机的运行。没有其他的方法可以终止虚拟机的运行,因为exitInternal方法是私有的,任何其他类都不能调用它。因此,任何试图退出虚拟机的代码都必须通过exit方法,从而在不触发安全异常的情况下,通过checkExit安全检查。 显然,安全策略的完整性依赖于谨慎的编码。标准类库中系统服务的提供者,在试图继续任何敏感的操作之前,都必须认真地与安全管理器进行协商。,51,安全管理器与访问权限,你的程序可以调用Sy

39、stem类的静态setSecurityManager方法来安装一个特定的安全管理器。一旦程序安装了安全管理器,如果再试图安装第二个安全管理器,那么只有当原安全管理器同意被替换时,第二个才能成功安装。 Java 2 平台的缺省安全管理器,不仅允许系统管理员,而且允许程序员对各个安全访问权限实施细致的控制。Java 2 平台的安全模型使用策略文件对各个权限实施控制。我们可以定义自己的权限类型,以及扩展缺省的安全管理器类。,52,Java安全架构-JDK1.0,外来代码只能在沙盒(Sandbox)中运行,53,Java安全架构-JDK1.1,通过数字签名的远程代码可以如本地代码一样在沙盒外运行,54

40、,Java 2 平台安全性,Java 2 平台则拥有更灵活的安全机制,它的安全策略建立了代码来源和访问权限集合之间的映射关系,55,Java安全架构-JDK1.2以上,不区分本地和远程代码 概念:policy、permissions、domains,56,Java 2 平台安全性,代码来源(code source)包含两个属性,一个是代码位置(例如,远程代码的HTTP URL,或者JAR文件中本地代码的文件URL),另一个是证书。 权限(permission)是指由安全管理器负责检查的任何属性。JDK 1.2 支持许多访问权限类,每个类都封装了特定权限的详细信息。例如,下面这个FilePerm

41、ission类的实例规定,它能够在/tmp目录下读取和写入任何文件。 FilePermission p = new FilePermission(“/tmp/*“, “read,write“); 更为重要的是,JDK 1.2中的Policy类的缺省实现可从访问权限文件中读取权限。在权限文件中,同样的读权限表示为: permission java.io.FilePermission “/tmp/*“, “read,write“;,57,Java 2 平台安全性,左图显示了JDK 1.2中提供的权限类的层次结构。JDK的后续版本添加了更多的权限类。,58,Java 2 平台安全性,当Securit

42、yManager类需要检查某个权限时,它要查看当前位于调用堆栈上的所有方法的类,然后它要获得所有类的保护域,并且询问每个保护域,该域的权限集合是否允许执行当前正在被检查的操作。如果所有的域都同意,那么检查得以通过。否则,就会抛出一个SecurityException异常。 为什么在调用堆栈上的所有方法都必须允许某个特定的操作呢?让我们通过一个实例来说明这个问题。假设一个applet的init方法想要打开一个文件,它可以会调用下面的语句: Reader in = new FileReader(name);,59,Java 2 平台安全性,FileReader构造器调用FileInputStrea

43、m构造器,而FileInputStream构造器调用安全管理器的checkRead方法,安全管理器最后调用一个带有FilePermission(name, “read”)对象的checkPermission。,60,Java 2 平台安全性,FileInputStream 和 SecurityManager类都属于系统类,它们的CodeSource为null,它们的权限都是由AllPermission类的一个实例组成的,AllPermission类允许执行所有的操作。显然地,仅仅根据它们的权限是无法确定检查的结果的。正如我们所看到的那样,checkPermission方法必须考虑applet类

44、的受限制的权限问题。通过检查整个调用堆栈,安全机制就能够确保一个类决不会要求另一个代表类自己去执行某个敏感的操作。,61,Java 2 平台安全性,java.lang.SecurityManager 1.0 void checkPermission(Permission p) 1.2 检查当前安全管理器是否授予给定的权限。如果没有授予该权限,本方法抛出一个SecurityException异常。 java.lang.Class 1.0 ProtectionDomain getProtectionDomain() 1.2 获取该类的保护域,如果该类被加载时没有保护域,则返回null。 java.

45、security.ProtectionDomain 1.2 ProtectionDomain(CodeSource source, PermissionCollection permissions) 用给定的代码来源和权限构建一个保护域。 CodeSource getCodeSource() 获取该保护域的代码来源。 boolean implies(Permission p) 如果该保护域允许给定的权限,则返回true。,62,Java 2 平台安全性,java.security.CodeSource 1.2 Certificate getCertificates() 获取与该代码来源相关的类

46、文件签名的证书。 URL getLocation() 获取与该代码来源相关的类文件地址。,63,安全策略文件,标准策略类要读取相应的策略文件,这些文件包含了将代码来源映射为权限的指令。在这些文件中,它们必须为使用的RMISecurityManager程序赋予网络访问权限。下面是一个典型的策略文件: grant codeBase “http:/ permission java.io.FilePermission “/tmp/*“, “read,write“; ; 该文件给所有下载自http:/ Java平台主目录的java.policy文件 用户主目录的.java.policy文件(注意文件名前

47、面的圆点)。 在测试期间,我们不喜欢经常地修改这些标准文件。因此,我们更愿意为每一个应用程序配置显式的策略文件。这样直接将权限写入一个独立的文件(比如MyApp.policy)中即可,并如下启动虚拟机: java -Djava.security.policy=MyApp.policy MyApp,65,安全策略文件,在这些例子中,MyApp.policy文件被添加到了其他有效的策略中。如果你在命令行中添加了第二个等号,比如 java -Djava.security.policy=MyApp.policy MyApp 那么你的应用程序就只使用指定的策略文件,而标准策略文件将被忽略。,66,安全策

48、略文件,正如前面所说,在缺省情况下,Java应用程序是不安装安全管理器的。因此,在你安装安全管理器之前,你看不到策略文件的作用。当然,你可以将这行代码 System.setSecurityManager(new SecurityManager(); 添加到main方法中,或者在启动虚拟机的时候添加命令行选项-Djava.security.manager。 java -Djava.security.manager -Djava.security.policy=MyApp.policy MyApp,67,安全策略文件,一个策略文件包含一系列grant项。每一项都具有以下的形式: grant codesource permission1; permission2; . . . 代码来源包含一个代码基(如果某一项适用于所有来源的代码,则代码基可以省略)和值得信赖的用户特征(principal)与证书签名者的名字(如果不要求对该项签名,则可以省略)。,68,安全策略文件,代码基可以设定为: codeBase “url“ 如果URL以“/”结束,那么它是一个目录。否则,它将被视为一个JAR文件的名字。例如: grant codeBase “ . . . ; grant codeBase “

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

当前位置:首页 > 其他


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