




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、企业级应用系统体系架构(一)企业级应用系统体系架构(一) 简介简介2021-10-22课程开设目的课程开设目的 n开设本课的目的就是要让软件学院的本科生能够构建开设本课的目的就是要让软件学院的本科生能够构建企业级分布式应用系统企业级分布式应用系统n不但知道该如何做,并且还要知道为什么那样做,以不但知道该如何做,并且还要知道为什么那样做,以及如何才能做好及如何才能做好n与与信息系统建模信息系统建模课程形成有机的集成,了解企业课程形成有机的集成,了解企业应用系统从建模到设计实现的完整过程和方案应用系统从建模到设计实现的完整过程和方案前导内容前导内容n什么是企业应用系统什么是企业应用系统n中间件技术
2、中间件技术n软件构件技术及其后继技术软件构件技术及其后继技术njava ee与与.net简介简介nxml及其应用及其应用n注解注解n访问数据库访问数据库-jdbc&ado.netnjavabean构件构件n事务管理事务管理n消息管理消息管理nrmi与与ejbnejb3.0中的会话中的会话beannejb3.0中的实体中的实体beannejb3.0中的消息驱动中的消息驱动bean3授课主题与内容授课主题与内容 n本课授课本课授课17次,每次次,每次2学时,共学时,共34学时:学时:n基于构件的分析与设计技术基于构件的分析与设计技术n安全控制、事务管理、消息机制、表示层开发技术安全控制、事务管理、
3、消息机制、表示层开发技术nweb services技术技术njava ee中的中的web servicesn.net中的中的web servicesn基于基于restful的的wsnweb2.0技术技术najax和和flexnsoa技术技术nsoa 基础理论、面向服务的分析与设计、基础理论、面向服务的分析与设计、soa实现方式举例实现方式举例n企业级应用系统体系架构的主要质量属性,以及实现对这些质量企业级应用系统体系架构的主要质量属性,以及实现对这些质量属性的要求可以采用的设计策略。属性的要求可以采用的设计策略。考核方式考核方式n课程大作业课程大作业n该课程大作业将与该课程大作业将与信息系统建
4、模信息系统建模课程的大作业统一课程的大作业统一n大作业以小组为单位完成大作业以小组为单位完成n大作业考核将与大作业考核将与信息系统建模信息系统建模课程一并进行,从不同角度考课程一并进行,从不同角度考核给分核给分n部分大作业将与摩根史坦利合作部分大作业将与摩根史坦利合作n成绩构成成绩构成n课程大作业中期检查课程大作业中期检查20%,第,第11周周末(周周末(5月月7-8日)日)n课程大作业期末验收课程大作业期末验收50%n期末考试期末考试30%,闭卷笔试,闭卷笔试助教与答疑助教与答疑n助教助教n王文婷王文婷 n答疑答疑n陈昊鹏:周三陈昊鹏:周三14:00-16:00 软件大楼软件大楼1111n王
5、文婷:周三王文婷:周三14:00-16:00 软件大楼软件大楼5402n摩根工程师:项目组协商摩根工程师:项目组协商企业级应用系统体系架构(一)企业级应用系统体系架构(一) 架构特征架构特征2021-10-22what is enterprise applicationnenterprise applications often have complex data - and lots of it - to work on, together with business rules that fail all tests of logical reasoning.nother terms fo
6、r enterprise applications include “information systemsnenterprise applications include payroll, patient records, shipping tracking, cost analysis, credit scoring, insurance, supply chain, accounting, customer service, and foreign exchange trading. nenterprise applications dont include automobile fue
7、l injection, word processors, elevator controllers, chemical plant controllers, telephone switches, operating systems, compilers, and games.what is enterprise applicationnenterprise applicationsnusually involve persistent data nusually have a lot of data nusually many people access data concurrently
8、 nusually have a lot of user interface screens nusually they need to integrate with other enterprise applications scattered around the enterprise nconceptual dissonance with the data ncomplex business illogic 10企业应用系统的特征企业应用系统的特征n一个企业系统是具备下列性质的系统:一个企业系统是具备下列性质的系统:n共享某些或全部在应用中被使用的资源共享某些或全部在应用中被使用的资源n
9、规划成为内部使用规划成为内部使用n必须在现有的架构内运行必须在现有的架构内运行n将由内部将由内部itit员工部署并提供支持员工部署并提供支持n需要更强的健壮性,对于异常处理和可扩展性都是如此需要更强的健壮性,对于异常处理和可扩展性都是如此n只能适度地失败只能适度地失败n必须合理地处理系统随时间推移而发生的演化必须合理地处理系统随时间推移而发生的演化dimensions of software complexityhigher technical complexity - embedded, real-time, distributed, fault-tolerant - custom, unp
10、recedented, architecture reengineering - high performancelower technical complexity - mostly 4gl, or component-based - application reengineering - interactive performancehighermanagement complexity - large scale - contractual - many stake holders - “projects”lowermanagement complexity - small scale
11、- informal - single stakeholder - “products”defense mis systemdefense weapon systemtelecom switchcase toolnational air trafficcontrol systementerprise is(family of isapplications)commercialcompilerbusinessspreadsheetis applicationdistributed objects (order entry)small scientificsimulationlarge-scale
12、organization/entitysimulation an average software project - 5-10 people - 3-9 month duration - 3-5 external interfaces - some unknowns & risksembeddedautomotive softwareis applicationgui/rdb (order entry) typical system architecturewhat is software architectureenterprise/product architectureenterpri
13、se/product architecturebusiness architecturebusiness architectureapplication architectureapplication architecturetechnical architecturetechnical architectureproduct architectureproduct architecturesoftware architecture quality metricsn availabilityn reliability n modifiabilityn performancen security
14、n testabilityn usabilityn supportabilityother factors to considernbusiness objectives(t2m,targeted market)nskill of development team and local market of teamncost to build and maintain v.s. benefitnmateriality of technologyncurrent system constrain, integrationnmigration, migration, migrationsummary
15、nsoftware architecture need to consider from both technical point of view as well as business point of viewnthere are different ways to communicate architecture design nthere is no the best architecture for any one software systemnalways need considernexternal constrain, such cost, infrastructure,nm
16、aturity of it organization, not only development, but also operationsnarchitecture is a live entity, therefore, ability to grow, migrate is very important16企业级应用系统体系架构(一)企业级应用系统体系架构(一)安全安全12021-10-22from:1.prentice.hall.ptr: core java 2 volume ii advanced features,8th.edition. apri.2008.17内容提要内容提要n类
17、加载器类加载器n字节码校验字节码校验n安全管理器与访问权限安全管理器与访问权限n数字签名数字签名n代码签名代码签名n加密加密18类加载器类加载器njava编译器能够将源程序转化为假想机器的机器语言,这种机器编译器能够将源程序转化为假想机器的机器语言,这种机器称为虚拟机。称为虚拟机。解释器能够将虚拟机的指令集翻译成目标机器的机解释器能够将虚拟机的指令集翻译成目标机器的机器语言。器语言。n请注意,虚拟机只加载程序执行时所需要的类文件。例如,假设请注意,虚拟机只加载程序执行时所需要的类文件。例如,假设程序从程序从myprogram.class开始运行,下面是虚拟机执行的步骤:开始运行,下面是虚拟机执
18、行的步骤:n虚拟机有一个用于加载类文件的机制,例如,从磁盘上读取虚拟机有一个用于加载类文件的机制,例如,从磁盘上读取文件或者请求文件或者请求web上的文件;它使用该机制来加载上的文件;它使用该机制来加载myprogram类文件中的内容。类文件中的内容。n如果如果myprogram类拥有类型为另一个类的实例变量,或者是类拥有类型为另一个类的实例变量,或者是拥有超类,那么这些类文件也会被加载。(加载某个类所依拥有超类,那么这些类文件也会被加载。(加载某个类所依赖的所有类的过程称为赖的所有类的过程称为类的解析类的解析。)。)n接着,虚拟机执行接着,虚拟机执行myprogram中的中的main方法(它
19、是静态的,方法(它是静态的,无需创建类的实例)。无需创建类的实例)。n如果如果main方法或者方法或者main调用的方法要用到更多的类,那么接调用的方法要用到更多的类,那么接下来就会加载这些类。下来就会加载这些类。19类加载器类加载器n然而,类加载机制并非只使用单个的类加载器。每个然而,类加载机制并非只使用单个的类加载器。每个java程序至程序至少拥有三个类加载器:少拥有三个类加载器:n引导类加载器引导类加载器n扩展类加载器扩展类加载器n系统类加载器(有时也称为应用类加载器)系统类加载器(有时也称为应用类加载器)20类加载器类加载器n引导类加载器负责加载系统类(通常从引导类加载器负责加载系统类
20、(通常从jar文件文件rt.jar中进行加中进行加载)载)。它是虚拟机整体中的一部分,而且通常是用。它是虚拟机整体中的一部分,而且通常是用c语言来实现语言来实现的。的。引导类加载器没有对应的引导类加载器没有对应的classloader对象对象,例如,该方法,例如,该方法string.class.getclassloader()将返回将返回null。n扩展类加载器用于从扩展类加载器用于从jre/lib/ext目录加载目录加载“标准的扩展标准的扩展”。你可以。你可以将将jar文件放入该目录,这样即使没有任何类路径,扩展类加载文件放入该目录,这样即使没有任何类路径,扩展类加载器也可以找到其中的各个类
21、。器也可以找到其中的各个类。n系统类加载器用于加载应用类系统类加载器用于加载应用类。它在由。它在由classpath环境变量或环境变量或者者-classpath命令行选项设置的类路径中的目录里或者是命令行选项设置的类路径中的目录里或者是jar/zip文件里查找这些类。文件里查找这些类。n在在sun公司的公司的java语言实现中,扩展类加载器和系统类加载器都语言实现中,扩展类加载器和系统类加载器都是用是用java来实现的。它们都是来实现的。它们都是urlclassloader类的实例。类的实例。21类加载器类加载器n类加载器有一种类加载器有一种“父子父子”关系。关系。除了引导类加载器外,每个类加
22、除了引导类加载器外,每个类加载器都有一个父类加载器载器都有一个父类加载器。根据规定,类加载器会为它的父类加根据规定,类加载器会为它的父类加载器提供一个机会,以便加载任何给定的类,并且只有在其父类载器提供一个机会,以便加载任何给定的类,并且只有在其父类加载器加载失败时,它才会加载该给定类加载器加载失败时,它才会加载该给定类。例如,当要求系统类。例如,当要求系统类加载器加载一个系统类(比如,加载器加载一个系统类(比如,java.util.arraylist)时,它首先)时,它首先要求扩展类加载器进行加载,该扩展类加载器则首先要求引导类要求扩展类加载器进行加载,该扩展类加载器则首先要求引导类加载器进
23、行加载。引导类加载器查找并加载加载器进行加载。引导类加载器查找并加载rt.jar中的这个类,而中的这个类,而无须其他类加载器做更多的搜索。无须其他类加载器做更多的搜索。22将类加载器作为命名空间将类加载器作为命名空间n每个每个java程序员都知道,包的命名是为了消除名字冲突。在标准程序员都知道,包的命名是为了消除名字冲突。在标准类库中,有两个名为类库中,有两个名为date的类,它们的实际名字分别为的类,它们的实际名字分别为java.util.date和和java.sql.date。使用简单的名字只是为了程序员的。使用简单的名字只是为了程序员的方便,它们要求程序要包含恰当的方便,它们要求程序要包
24、含恰当的import语句。在一个正在执行语句。在一个正在执行的程序中,所有的类名都包含它们的包名。的程序中,所有的类名都包含它们的包名。n然而,令人惊奇的是,然而,令人惊奇的是,在同一个虚拟机中,可以有两个类,它们在同一个虚拟机中,可以有两个类,它们的类名和包名都是相同的。类是由它的全名的类名和包名都是相同的。类是由它的全名和和类加载器来确定的。类加载器来确定的。这项技术在加载来自多处的代码时很有用。例如,浏览器为每一这项技术在加载来自多处的代码时很有用。例如,浏览器为每一个个web页都使用了一个独立的页都使用了一个独立的applet类加载器类的实例。这样,虚类加载器类的实例。这样,虚拟机就能
25、区分来自不同拟机就能区分来自不同web页的各个类,而不用管它们的名字是页的各个类,而不用管它们的名字是什么。什么。23编写你自己的类加载器编写你自己的类加载器n如果要编写自己的类加载器,你只需要继承如果要编写自己的类加载器,你只需要继承classloader类,然后类,然后覆盖下面这个方法覆盖下面这个方法findclass(string classname)nclassloader超类的超类的loadclass方法用于将类的加载操作委托给其方法用于将类的加载操作委托给其父类加载器去进行,只有当该类尚未加载并且父类加载器也无法父类加载器去进行,只有当该类尚未加载并且父类加载器也无法加载该类时,才
26、调用加载该类时,才调用findclass方法。方法。n如果要实现该方法,你就必须:如果要实现该方法,你就必须:n为来自本地文件系统或者其他来源的类加载其字节码。为来自本地文件系统或者其他来源的类加载其字节码。n调用调用classloader超类的超类的defineclass方法,向虚拟机提供字节方法,向虚拟机提供字节码。码。24编写你自己的类加载器编写你自己的类加载器n我们建立了一个类加载器,我们建立了一个类加载器,用于加载加密过的类文件。用于加载加密过的类文件。该程序要求用户输入第一个该程序要求用户输入第一个要加载的类的名字(即包含要加载的类的名字(即包含main方法的类)和密钥。然方法的类
27、)和密钥。然后,使用一个专门的类加载后,使用一个专门的类加载器来加载指定的类并调用器来加载指定的类并调用main方法。该类加载器对指方法。该类加载器对指定的类和所有被其引用的非定的类和所有被其引用的非系统类进行解密。最后,该系统类进行解密。最后,该程序调用已加载类的程序调用已加载类的main方方法。法。 25编写你自己的类加载器编写你自己的类加载器 class cryptoclassloader extends classloader /* constructs a crypto class loader. param k the decryption key */ public crypto
28、classloader(int k) key = k; protected class findclass(string name) throws classnotfoundexception byte classbytes = null; try classbytes = loadclassbytes(name); 26编写你自己的类加载器编写你自己的类加载器 catch (ioexception e) throw new classnotfoundexception(name); class cl = defineclass(name, classbytes, 0, classbytes.
29、length); if (cl = null) throw new classnotfoundexception(name); return cl; /* loads and 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(
30、., /) + .caesar; fileinputstream in = null; in = new fileinputstream(cname); try bytearrayoutputstream 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编写你自己的类加载器编写你自
31、己的类加载器 private int key; n我们的我们的caesar密码版本使用的密钥是从密码版本使用的密钥是从1255之间的一个数字,之间的一个数字,解密时,只需将密钥与每个字节相加,然后对解密时,只需将密钥与每个字节相加,然后对256取余。取余。caesar.java程序就实现了这种加密行为。程序就实现了这种加密行为。n为了不与通常的类加载器相混淆,我们对加密的类文件使用了不为了不与通常的类加载器相混淆,我们对加密的类文件使用了不同的扩展名同的扩展名.caesar。n解密时,类加载器只需要将每个字节减去该密钥即可。解密时,类加载器只需要将每个字节减去该密钥即可。29编写你自己的类加载
32、器编写你自己的类加载器 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 fileinputstream(args0); fileoutputstream out = new fileo
33、utputstream(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编写你自己的类加载器编写你自己的类加载器 public void runclass(string name, str
34、ing 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(this, e); 32编写你自己的类加载器编写你自己的类加载器n
35、对类文件进行加密有很大的用途(当然,使用的密码的强度应该对类文件进行加密有很大的用途(当然,使用的密码的强度应该高于高于caesar密码),如果没有加密密钥,类文件就毫无用处。它密码),如果没有加密密钥,类文件就毫无用处。它们既不能由标准虚拟机来执行,也不能轻易地被反汇编。们既不能由标准虚拟机来执行,也不能轻易地被反汇编。n这就是说,这就是说,你可以使用定制的类加载器来认证类用户的身份,或你可以使用定制的类加载器来认证类用户的身份,或者确保程序在运行之前已经支付了软件费用者确保程序在运行之前已经支付了软件费用。当然,加密只是定。当然,加密只是定制类加载器的应用之一。你可以使用其他类型的加载器来
36、解决别制类加载器的应用之一。你可以使用其他类型的加载器来解决别的问题,例如,将类文件存储到数据库中。的问题,例如,将类文件存储到数据库中。33编写你自己的类加载器编写你自己的类加载器njava.lang.class 1.0 nclassloader getclassloader()n获取加载该类的类加载器。获取加载该类的类加载器。njava.lang.classloader 1.0 nclassloader getparent() 1.2n返回父类加载器,如果父类加载器是引导类加载器,则返回返回父类加载器,如果父类加载器是引导类加载器,则返回null。nstatic classloader g
37、etsystemclassloader() 1.2n获取系统类加载器,即用于加载第一个应用类的类加载器。获取系统类加载器,即用于加载第一个应用类的类加载器。nprotected class findclass(string name) 1.2n类加载器应该覆盖该方法,以查找类的字节码,并通过调用类加载器应该覆盖该方法,以查找类的字节码,并通过调用defineclass方法将字节码传给虚拟机。方法将字节码传给虚拟机。n参数参数:nname类名类名; 使用使用 . 作为包名分隔符,并且不使用作为包名分隔符,并且不使用.class 后缀后缀34编写你自己的类加载器编写你自己的类加载器nclass d
38、efineclass(string name, byte data, int offset, int length)n将一个新的类添加到虚拟机中。将一个新的类添加到虚拟机中。n参数参数:nname类名类名; 使用使用 . 作为包名分隔符,并且不使用作为包名分隔符,并且不使用.class 后缀后缀 ndata用于存放该类字节码的数组用于存放该类字节码的数组noffset数组中字节码的起始位置数组中字节码的起始位置 nlength数组中字节码的长度数组中字节码的长度njava.lang.thread 1.0nclassloader getcontextclassloader() 1.2n获取类加载
39、器,该线程的创建者将其指定为执行该线程时最适合使获取类加载器,该线程的创建者将其指定为执行该线程时最适合使用的类加载器。用的类加载器。nvoid setcontextclassloader(classloader loader) 1.2n为该线程中的代码设置一个类加载器,以获取要加载的类。如果在为该线程中的代码设置一个类加载器,以获取要加载的类。如果在启动一个线程时没有显式地设置上下文类加载器,则使用父线程的启动一个线程时没有显式地设置上下文类加载器,则使用父线程的上下文类加载器。上下文类加载器。35内容提要内容提要n类加载器类加载器n字节码校验字节码校验n安全管理器与访问权限安全管理器与访问
40、权限n数字签名数字签名n代码签名代码签名n加密加密36字节码校验字节码校验n当类加载器将新加载的当类加载器将新加载的java平台类的字节码传递给虚拟机时,这平台类的字节码传递给虚拟机时,这些字节码首先要接受些字节码首先要接受“校验器(校验器(verifier)”的校验。的校验。校验器负责校验器负责检查那些指令无法执行的明显有破坏性的操作。除了系统类外,检查那些指令无法执行的明显有破坏性的操作。除了系统类外,所有的类都要被校验,所有的类都要被校验,不过,你可以使用非正式的不过,你可以使用非正式的-noverify选项选项来钝化校验。来钝化校验。n例如,你可以使用下面的命令行:例如,你可以使用下面
41、的命令行:java -noverify hello37字节码校验字节码校验n下面是校验器执行的一些检查:下面是校验器执行的一些检查:n变量要在使用之前进行初始化。变量要在使用之前进行初始化。n方法调用与对象引用类型之间要匹配。方法调用与对象引用类型之间要匹配。n访问私有数据和方法的规则没有被违反。访问私有数据和方法的规则没有被违反。n对本地变量的访问都在运行时堆栈内。对本地变量的访问都在运行时堆栈内。n运行时堆栈没有溢出。运行时堆栈没有溢出。n如果以上这些检查中任何一条没有通过,那么该类就被认为遭到如果以上这些检查中任何一条没有通过,那么该类就被认为遭到了破坏,并且不予加载。了破坏,并且不予加
42、载。38字节码校验字节码校验n这种严格的校验是出于安全上的考虑这种严格的校验是出于安全上的考虑n通过修改运行时堆栈中的值,或者向系统对象的私有数据字通过修改运行时堆栈中的值,或者向系统对象的私有数据字段写入数据,某个程序就会突破浏览器的安全防线。段写入数据,某个程序就会突破浏览器的安全防线。n用用java语言编译器生成的类文件总是可以通过校验的语言编译器生成的类文件总是可以通过校验的。n校验器总是在防范被故意篡改的类文件,而不仅仅只是检查校验器总是在防范被故意篡改的类文件,而不仅仅只是检查编译器产生的类文件。编译器产生的类文件。39字节码校验字节码校验n下面的例子将展示如何创建一个变动过的类文
43、件。我们从示例程下面的例子将展示如何创建一个变动过的类文件。我们从示例程序序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作为一次实验
44、,请尝试编译下面这个对该程序进行修改后的文件。作为一次实验,请尝试编译下面这个对该程序进行修改后的文件。static int fun() int m = 1; int n; m = 1; m = 2; int r = m + n; return r;41字节码校验字节码校验n在这种情况下,在这种情况下,n没有被初始化,它可以是任何随机值。当然,没有被初始化,它可以是任何随机值。当然,编译器能够检测到这个问题并拒绝编译该程序。如果要建立一个编译器能够检测到这个问题并拒绝编译该程序。如果要建立一个不良的类文件,我们必须得多花点功夫。首先,运行不良的类文件,我们必须得多花点功夫。首先,运行javap
45、程序,程序,以便知晓编译器是如何翻译以便知晓编译器是如何翻译fun方法的。下面这个命令方法的。下面这个命令javap -c verifiertestn用助记(用助记(mnemonic)格式显示了类文件中的字节码。)格式显示了类文件中的字节码。42字节码校验字节码校验method int fun() 0 iconst_1 1 istore_0 2 iconst_2 3 istore_1 4 iload_0 5 iload_1 6 iadd 7 istore_2 8 iload_2 9 ireturn43字节码校验字节码校验n我们使用一个十六进制编辑器将指令我们使用一个十六进制编辑器将指令3从从i
46、store_1改为改为istore_0,也,也就是说,局部变量就是说,局部变量0(即(即m)被初始化了两次,而局部变量)被初始化了两次,而局部变量1(即(即n)则根本没有初始化。则根本没有初始化。0 iconst_1 041 istore_0 3b2 iconst_2 053 istore_1 3c4 iload_0 1a5 iload_1 1b6 iadd 607 istore_2 3d8 iload_2 1c9 ireturn ac44字节码校验字节码校验n你可以使用十六进制编辑器你可以使用十六进制编辑器(例如(例如dataworkshop,可以,可以从从http:/www.datawor
47、kshop.de处下载)来进行修改操作。处下载)来进行修改操作。当然,你也可以使用当然,你也可以使用hexl-mode的的emacs进行修改。在进行修改。在左图中,你可以看到类文件左图中,你可以看到类文件verifiertest.class被加载到了被加载到了dataworkshop编辑器中,编辑器中,fun方法的字节码已经被选定。方法的字节码已经被选定。45字节码校验字节码校验n将将3c改为改为3b并保存类文件。然后设法运行并保存类文件。然后设法运行verifiertest程序。你程序。你将会看到下面的出错信息:将会看到下面的出错信息: exception in thread main ja
48、va.lang.verifyerror: (class: verifiertest, method:fun signature: ()i) accessing value from uninitialized register 1n这很好,虚拟机发现了我们所做的修改。这很好,虚拟机发现了我们所做的修改。46字节码校验字节码校验n现在用现在用-noverify选项(或者选项(或者-xverify:none)来运行程序:)来运行程序:java -noverify verifiertestn从表面上看,从表面上看,fun方法似乎返回了一个随机值。但实际上,该值方法似乎返回了一个随机值。但实际上,该值
49、是是2与存储在尚未初始化的变量与存储在尚未初始化的变量n中的值相加得到的结果。下面是中的值相加得到的结果。下面是典型的输出结果:典型的输出结果:1 + 2 = 1510233047内容提要内容提要n类加载器类加载器n字节码校验字节码校验n安全管理器与访问权限安全管理器与访问权限n数字签名数字签名n代码签名代码签名n加密加密48安全管理器与访问权限安全管理器与访问权限n安全管理器是一个负责控制某个操作是否允许执行的类安全管理器是一个负责控制某个操作是否允许执行的类。安全管。安全管理器负责检查的操作包括以下几个:理器负责检查的操作包括以下几个:n当前线程是否能够创建一个新的类加载器;当前线程是否能
50、够创建一个新的类加载器;n当前线程是否能够中止虚拟机的运行;当前线程是否能够中止虚拟机的运行;n某个类是否能够访问另一个类的成员;某个类是否能够访问另一个类的成员;n当前线程是否能够访问本地文件;当前线程是否能够访问本地文件;n当前线程是否能够打开到达外部主机的当前线程是否能够打开到达外部主机的socket连接;连接;n某个类是否能够启动打印作业;某个类是否能够启动打印作业;n某个类是否能够访问系统剪贴板;某个类是否能够访问系统剪贴板;n某个类是否能够访问某个类是否能够访问awt事件队列;事件队列;n当前线程是否可被信任以打开一个顶层窗口。当前线程是否可被信任以打开一个顶层窗口。n整个整个ja
51、va类库中还有许多其他类似的检查。类库中还有许多其他类似的检查。49安全管理器与访问权限安全管理器与访问权限n在运行在运行java应用程序时,应用程序时,缺省的设置是不安装安全管理器的缺省的设置是不安装安全管理器的,这,这样所有的操作都是允许的。另一方面,样所有的操作都是允许的。另一方面,applet浏览器都直接地安浏览器都直接地安装了一个功能受限的安全管理器装了一个功能受限的安全管理器。n例如,例如,applet不允许退出虚拟机。如果它们试图调用不允许退出虚拟机。如果它们试图调用exit方法,就方法,就会抛出一个安全异常。下面将详细说明这种情况。会抛出一个安全异常。下面将详细说明这种情况。r
52、untime类的类的exit方法调用安全管理器的方法调用安全管理器的checkexit方法,下面是方法,下面是exit方法的全部方法的全部代码:代码:public void exit(int status) securitymanager security = system.getsecuritymanager(); if (security != null) security.checkexit(status); exitinternal(status);50安全管理器与访问权限安全管理器与访问权限n如果安全管理器不同意退出请求,那么如果安全管理器不同意退出请求,那么checkexit方法就
53、会抛出一方法就会抛出一个个securityexception异常。异常。n只有当没有任何异常发生时,只有当没有任何异常发生时,exit方法才能继续执行。然后它调方法才能继续执行。然后它调用本地私有的用本地私有的exitinternal方法,实际终止虚拟机的运行。方法,实际终止虚拟机的运行。没有其没有其他的方法可以终止虚拟机的运行,因为他的方法可以终止虚拟机的运行,因为exitinternal方法是私有的,方法是私有的,任何其他类都不能调用它。因此,任何其他类都不能调用它。因此,任何试图退出虚拟机的代码都任何试图退出虚拟机的代码都必须通过必须通过exit方法,从而在不触发安全异常的情况下,通过方
54、法,从而在不触发安全异常的情况下,通过checkexit安全检查。安全检查。n显然,安全策略的完整性依赖于谨慎的编码。标准类库中系统服显然,安全策略的完整性依赖于谨慎的编码。标准类库中系统服务的提供者,在试图继续任何敏感的操作之前,都必须认真地与务的提供者,在试图继续任何敏感的操作之前,都必须认真地与安全管理器进行协商。安全管理器进行协商。51安全管理器与访问权限安全管理器与访问权限n你的程序可以调用你的程序可以调用system类的静态类的静态setsecuritymanager方法来安方法来安装一个特定的安全管理器装一个特定的安全管理器。一旦程序安装了安全管理器,如果再一旦程序安装了安全管理
55、器,如果再试图安装第二个安全管理器,那么只有当原安全管理器同意被替试图安装第二个安全管理器,那么只有当原安全管理器同意被替换时,第二个才能成功安装换时,第二个才能成功安装。njava 2 平台的缺省安全管理器,不仅允许系统管理员,而且允许平台的缺省安全管理器,不仅允许系统管理员,而且允许程序员对各个安全访问权限实施细致的控制。程序员对各个安全访问权限实施细致的控制。java 2 平台的安全平台的安全模型使用策略文件对各个权限实施控制。我们可以定义自己的权模型使用策略文件对各个权限实施控制。我们可以定义自己的权限类型,以及扩展缺省的安全管理器类。限类型,以及扩展缺省的安全管理器类。52java安
56、全架构安全架构- -jdk1.0外来代码只能在沙盒(外来代码只能在沙盒(sandboxsandbox)中运行)中运行53java安全架构安全架构- -jdk1.1通过数字签名的远程代码可以如本地通过数字签名的远程代码可以如本地代码一样在沙盒外运行代码一样在沙盒外运行54java 2 平台安全性平台安全性njava 2 平台则拥有更灵平台则拥有更灵活的安全机制,它的安活的安全机制,它的安全策略建立了代码来源全策略建立了代码来源和访问权限集合之间的和访问权限集合之间的映射关系映射关系 55java安全架构安全架构- -jdk1.2以上以上n不区分本地和远程代码不区分本地和远程代码n概念:概念:po
57、licypolicy、permissionspermissions、domainsdomains56java 2 平台安全性平台安全性n代码来源代码来源(code source)包含两个属性,一个是)包含两个属性,一个是代码位置代码位置(例如,(例如,远程代码的远程代码的http url,或者,或者jar文件中本地代码的文件文件中本地代码的文件url),),另一个是另一个是证书证书。n权限权限(permission)是指由安全管理器负责检查的任何属性是指由安全管理器负责检查的任何属性。jdk 1.2 支持许多访问权限类,每个类都封装了特定权限的详细信息。支持许多访问权限类,每个类都封装了特定权
58、限的详细信息。例如,下面这个例如,下面这个filepermission类的实例规定,它能够在类的实例规定,它能够在/tmp目录目录下读取和写入任何文件。下读取和写入任何文件。filepermission p = new filepermission(/tmp/*, read,write);n更为重要的是,更为重要的是,jdk 1.2中的中的policy类的缺省实现可从访问权限文类的缺省实现可从访问权限文件中读取权限。在权限文件中,同样的读权限表示为:件中读取权限。在权限文件中,同样的读权限表示为:permission java.io.filepermission /tmp/*, read,wr
59、ite;57java 2 平台安全性平台安全性n左图显示了左图显示了jdk 1.2中中提供的权限提供的权限类的层次结类的层次结构。构。jdk的的后续版本添后续版本添加了更多的加了更多的权限类。权限类。 58java 2 平台安全性平台安全性n当当securitymanager类需要检查某个权限时,它要查看当前位于类需要检查某个权限时,它要查看当前位于调用堆栈上的所有方法的类,然后它要获得所有类的保护域,并调用堆栈上的所有方法的类,然后它要获得所有类的保护域,并且询问每个保护域,该域的权限集合是否允许执行当前正在被检且询问每个保护域,该域的权限集合是否允许执行当前正在被检查的操作。查的操作。如果
60、所有的域都同意,那么检查得以通过。否则,就如果所有的域都同意,那么检查得以通过。否则,就会抛出一个会抛出一个securityexception异常。异常。n为什么在调用堆栈上的所有方法都必须允许某个特定的操作呢?为什么在调用堆栈上的所有方法都必须允许某个特定的操作呢?让我们通过一个实例来说明这个问题。假设一个让我们通过一个实例来说明这个问题。假设一个applet的的init方法方法想要打开一个文件,它可以会调用下面的语句:想要打开一个文件,它可以会调用下面的语句:reader in = new filereader(name);59java 2 平台安全性平台安全性nfilereader构造器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 16468:2025 EN Investment castings (steel,nickel alloys and cobalt alloys) - General technical requirements
- 【正版授权】 IEC 60335-2-15:2002+AMD1:2005 CSV FR-D Household and similar electrical appliances - Safety - Part 2-15: Particular requirements for appliances for heating liquids
- 【正版授权】 IEC 61326-2-6:2025 EN-FR Electrical equipment for measurement,control and laboratory use - EMC requirements - Part 2-6: Particular requirements - In vitro diagnostic (IVD)
- 【正版授权】 IEC 60079-18:2025 EN-FR Explosive atmospheres - Part 18: Equipment protection by encapsulation “m”
- 校车人员安全知识培训课件
- 校安头条安全知识培训课件
- 北戴河区法律知识培训课件
- 西部计划试题及答案
- 法警聘用制面试题及答案
- java语言赋值运算符面试题及答案
- DB51-T 3251-2025 煤矿井下应急广播系统使用管理规范
- 静压植桩机钢管桩施工技术
- 高值耗材点评制度
- 防台防汛培训课件教学
- 2024年施工员题库含完整答案(必刷)
- 道路施工流程讲解
- 有限合伙企业合伙协议
- 保险资管合规风险管理-深度研究
- 2022教师民族团结培训
- 《慢阻肺健康大课堂》课件
- 2024人教版英语七年级下册《Unit 3 Keep Fit How do we keep fit》大单元整体教学设计2022课标
评论
0/150
提交评论