版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)一)企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)一) 簡介簡介2022-4-28課程開設(shè)目的課程開設(shè)目的 n開設(shè)本課的目的就是要讓軟件學(xué)院的本科生能夠構(gòu)建開設(shè)本課的目的就是要讓軟件學(xué)院的本科生能夠構(gòu)建企業(yè)級分布式應(yīng)用系統(tǒng)企業(yè)級分布式應(yīng)用系統(tǒng)n不但知道該如何做,并且還要知道為什么那樣做,以不但知道該如何做,并且還要知道為什么那樣做,以及如何才能做好及如何才能做好n與與課程形成有機的集成,了解企業(yè)應(yīng)課程形成有機的集成,了解企業(yè)應(yīng)用系統(tǒng)從建模到設(shè)計實現(xiàn)的完整過程和方案用系統(tǒng)從建模到設(shè)計實現(xiàn)的完整過程和方案前導(dǎo)內(nèi)容前導(dǎo)內(nèi)容n什么是企業(yè)應(yīng)用系統(tǒng)什么是企業(yè)應(yīng)用系統(tǒng)n中間件技術(shù)中間件技術(shù)n軟件構(gòu)件技術(shù)及其后
2、繼技術(shù)軟件構(gòu)件技術(shù)及其后繼技術(shù)nJava EE與與.NET簡介簡介nXML及其應(yīng)用及其應(yīng)用n注解注解n訪問數(shù)據(jù)庫訪問數(shù)據(jù)庫-JDBC&ADO.NETnJavaBean構(gòu)件構(gòu)件n事務(wù)管理事務(wù)管理n消息管理消息管理nRMI與與EJBnEJB3.0中的會話中的會話BeannEJB3.0中的實體中的實體BeannEJB3.0中的消息驅(qū)動中的消息驅(qū)動Bean3授課主題與內(nèi)容授課主題與內(nèi)容 n本課授課本課授課17次,每次次,每次2學(xué)時,共學(xué)時,共34學(xué)時:學(xué)時:n基于構(gòu)件的分析與設(shè)計技術(shù)基于構(gòu)件的分析與設(shè)計技術(shù)n安全控制、事務(wù)管理、消息機制、表示層開發(fā)技術(shù)安全控制、事務(wù)管理、消息機制、表示層開發(fā)技
3、術(shù)nWeb Services技術(shù)技術(shù)nJava EE中的中的Web Servicesn.NET中的中的Web Servicesn基于基于RESTful的的WSnWeb2.0技術(shù)技術(shù)nAjax和和FlexnSOA技術(shù)技術(shù)nSOA 基礎(chǔ)理論、面向服務(wù)的分析與設(shè)計、基礎(chǔ)理論、面向服務(wù)的分析與設(shè)計、SOA實現(xiàn)方式舉例實現(xiàn)方式舉例n企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)的主要質(zhì)量屬性,以及實現(xiàn)對這些質(zhì)企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)的主要質(zhì)量屬性,以及實現(xiàn)對這些質(zhì)量屬性的要求可以采用的設(shè)計策略。量屬性的要求可以采用的設(shè)計策略。考核方式考核方式n課程大作業(yè)課程大作業(yè)n該課程大作業(yè)將與該課程大作業(yè)將與課程的大作業(yè)統(tǒng)一課程的大作業(yè)統(tǒng)一
4、n大作業(yè)以小組為單位完成大作業(yè)以小組為單位完成n大作業(yè)考核將與大作業(yè)考核將與課程一并進行,從不同角度考核給課程一并進行,從不同角度考核給分分n部分大作業(yè)將與摩根史坦利合作部分大作業(yè)將與摩根史坦利合作n成績構(gòu)成成績構(gòu)成n課程大作業(yè)中期檢查課程大作業(yè)中期檢查20%,第,第11周周末周周末5月月7-8日)日)n課程大作業(yè)期末驗收課程大作業(yè)期末驗收50%n期末考試期末考試30%,閉卷筆試,閉卷筆試助教與答疑助教與答疑n助教助教n王文婷王文婷 wwtvanessagmail n答疑答疑n陳昊鵬:周三陳昊鵬:周三14:00-16:00 軟件大樓軟件大樓1111n王文婷:周三王文婷:周三14:00-16:0
5、0 軟件大樓軟件大樓5402n摩根工程師:項目組協(xié)商摩根工程師:項目組協(xié)商企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)一)企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)一) 架構(gòu)特征架構(gòu)特征2022-4-28What 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 for enterprise application
6、s 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 fuel injection, word proces
7、sors, 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 nusually have a lot of
8、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企業(yè)應(yīng)用系統(tǒng)的特征企業(yè)應(yīng)用系統(tǒng)的特征n一個企業(yè)系統(tǒng)是具備下列性質(zhì)的系統(tǒng):一個企業(yè)系統(tǒng)是具備下列性質(zhì)的系統(tǒng):n共享某些或全部在應(yīng)用中被使用的資源共享某些或全部在應(yīng)用中被使用的資源n規(guī)劃成為內(nèi)部使用規(guī)劃成為內(nèi)部使用n必須在現(xiàn)有的架
9、構(gòu)內(nèi)運行必須在現(xiàn)有的架構(gòu)內(nèi)運行n將由內(nèi)部將由內(nèi)部ITIT員工部署并提供支持員工部署并提供支持n需要更強的健壯性,對于異常處理和可擴展性都是如此需要更強的健壯性,對于異常處理和可擴展性都是如此n只能適度地失敗只能適度地失敗n必須合理地處理系統(tǒng)隨時間推移而發(fā)生的演化必須合理地處理系統(tǒng)隨時間推移而發(fā)生的演化Dimensions of software complexityHigher technical complexity - Embedded, real-time, distributed, fault-tolerant - Custom, unprecedented, architecture
10、 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 - Informal - Single stak
11、eholder - “Products”Defense MIS SystemDefense Weapon SystemTelecom SwitchCASE ToolNational Air TrafficControl SystemEnterprise IS(Family of ISApplications)CommercialCompilerBusinessSpreadsheetIS ApplicationDistributed Objects (Order Entry)Small ScientificSimulationLarge-ScaleOrganization/EntitySimul
12、ation 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 ArchitectureEnterprise/Product Architect
13、ureBusiness ArchitectureBusiness ArchitectureApplication ArchitectureApplication ArchitectureTechnical ArchitectureTechnical ArchitectureProduct ArchitectureProduct ArchitectureSoftware Architecture Quality Metricsn Availabilityn Reliability n Modifiabilityn Performancen Securityn Testabilityn Usabi
14、lityn 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, migrationSummarynSoftware Architectu
15、re 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,nMaturity of IT organi
16、zation, not only development, but also operationsnArchitecture is a live entity, therefore, ability to grow, migrate is very important16企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)一)企業(yè)級應(yīng)用系統(tǒng)體系架構(gòu)一)安全安全1 12022-4-28From:Prentice.Hall.PTR: Core Java 2 Volume II Advanced Features,8th.Edition. Apri.2019.17內(nèi)容提要內(nèi)容提要n類加載器類加載器n字節(jié)碼校驗字節(jié)碼校驗n安全管理
17、器與訪問權(quán)限安全管理器與訪問權(quán)限n數(shù)字簽名數(shù)字簽名n代碼簽名代碼簽名n加密加密18類加載器類加載器nJava編譯器能夠?qū)⒃闯绦蜣D(zhuǎn)化為假想機器的機器語言,這種機器編譯器能夠?qū)⒃闯绦蜣D(zhuǎn)化為假想機器的機器語言,這種機器稱為虛擬機。解釋器能夠?qū)⑻摂M機的指令集翻譯成目標機器的機稱為虛擬機。解釋器能夠?qū)⑻摂M機的指令集翻譯成目標機器的機器語言。器語言。n請注意,虛擬機只加載程序執(zhí)行時所需要的類文件。例如,假設(shè)請注意,虛擬機只加載程序執(zhí)行時所需要的類文件。例如,假設(shè)程序從程序從MyProgram.class開始運行,下面是虛擬機執(zhí)行的步驟:開始運行,下面是虛擬機執(zhí)行的步驟:n虛擬機有一個用于加載類文件的機制,
18、例如,從磁盤上讀取文件虛擬機有一個用于加載類文件的機制,例如,從磁盤上讀取文件或者請求或者請求web上的文件;它使用該機制來加載上的文件;它使用該機制來加載MyProgram類文件類文件中的內(nèi)容。中的內(nèi)容。n如果如果MyProgram類擁有類型為另一個類的實例變量,或者是擁有類擁有類型為另一個類的實例變量,或者是擁有超類,那么這些類文件也會被加載。(加載某個類所依賴的所有超類,那么這些類文件也會被加載。(加載某個類所依賴的所有類的過程稱為類的解析。)類的過程稱為類的解析。)n接著,虛擬機執(zhí)行接著,虛擬機執(zhí)行MyProgram中的中的main方法它是靜態(tài)的,無需方法它是靜態(tài)的,無需創(chuàng)建類的實例)
19、。創(chuàng)建類的實例)。n如果如果main方法或者方法或者main調(diào)用的方法要用到更多的類,那么接下來調(diào)用的方法要用到更多的類,那么接下來就會加載這些類。就會加載這些類。19類加載器類加載器n然而,類加載機制并非只使用單個的類加載器。每個然而,類加載機制并非只使用單個的類加載器。每個Java程序至程序至少擁有三個類加載器:少擁有三個類加載器:n引導(dǎo)類加載器引導(dǎo)類加載器n擴展類加載器擴展類加載器n系統(tǒng)類加載器有時也稱為應(yīng)用類加載器)系統(tǒng)類加載器有時也稱為應(yīng)用類加載器)20類加載器類加載器n引導(dǎo)類加載器負責(zé)加載系統(tǒng)類通常從引導(dǎo)類加載器負責(zé)加載系統(tǒng)類通常從JAR文件文件rt.jar中進行加中進行加載)。它
20、是虛擬機整體中的一部分,而且通常是用載)。它是虛擬機整體中的一部分,而且通常是用C語言來實現(xiàn)語言來實現(xiàn)的。引導(dǎo)類加載器沒有對應(yīng)的的。引導(dǎo)類加載器沒有對應(yīng)的ClassLoader對象,例如,該方法對象,例如,該方法nString.class.getClassLoader()n將返回將返回null。n擴展類加載器用于從擴展類加載器用于從jre/lib/ext目錄加載目錄加載“標準的擴展標準的擴展”。你可以。你可以將將JAR文件放入該目錄,這樣即使沒有任何類路徑,擴展類加載文件放入該目錄,這樣即使沒有任何類路徑,擴展類加載器也可以找到其中的各個類。器也可以找到其中的各個類。n系統(tǒng)類加載器用于加載應(yīng)用
21、類。它在由系統(tǒng)類加載器用于加載應(yīng)用類。它在由CLASSPATH環(huán)境變量或環(huán)境變量或者者-classpath命令行選項設(shè)置的類路徑中的目錄里或者是命令行選項設(shè)置的類路徑中的目錄里或者是JAR/ZIP文件里查找這些類。文件里查找這些類。n在在Sun公司的公司的Java語言實現(xiàn)中,擴展類加載器和系統(tǒng)類加載器都語言實現(xiàn)中,擴展類加載器和系統(tǒng)類加載器都是用是用Java來實現(xiàn)的。它們都是來實現(xiàn)的。它們都是URLClassLoader類的實例。類的實例。21類加載器類加載器n類加載器有一種類加載器有一種“父子父子關(guān)系。除了引導(dǎo)類加載器外,每個類加關(guān)系。除了引導(dǎo)類加載器外,每個類加載器都有一個父類加載器。根據(jù)
22、規(guī)定,類加載器會為它的父類加載器都有一個父類加載器。根據(jù)規(guī)定,類加載器會為它的父類加載器提供一個機會,以便加載任何給定的類,并且只有在其父類載器提供一個機會,以便加載任何給定的類,并且只有在其父類加載器加載失敗時,它才會加載該給定類。例如,當(dāng)要求系統(tǒng)類加載器加載失敗時,它才會加載該給定類。例如,當(dāng)要求系統(tǒng)類加載器加載一個系統(tǒng)類比如,加載器加載一個系統(tǒng)類比如,java.util.ArrayList時,它首先時,它首先要求擴展類加載器進行加載,該擴展類加載器則首先要求引導(dǎo)類要求擴展類加載器進行加載,該擴展類加載器則首先要求引導(dǎo)類加載器進行加載。引導(dǎo)類加載器查找并加載加載器進行加載。引導(dǎo)類加載器查找
23、并加載rt.jar中的這個類,而中的這個類,而無須其他類加載器做更多的搜索。無須其他類加載器做更多的搜索。22將類加載器作為命名空間將類加載器作為命名空間n每個每個Java程序員都知道,包的命名是為了消除名字沖突。在標準程序員都知道,包的命名是為了消除名字沖突。在標準類庫中,有兩個名為類庫中,有兩個名為Date的類,它們的實際名字分別為的類,它們的實際名字分別為java.util.Date和和java.sql.Date。使用簡單的名字只是為了程序員的。使用簡單的名字只是為了程序員的方便,它們要求程序要包含恰當(dāng)?shù)姆奖?,它們要求程序要包含恰?dāng)?shù)膇mport語句。在一個正在執(zhí)行語句。在一個正在執(zhí)行的
24、程序中,所有的類名都包含它們的包名。的程序中,所有的類名都包含它們的包名。n然而,令人驚奇的是,在同一個虛擬機中,可以有兩個類,它們?nèi)欢?,令人驚奇的是,在同一個虛擬機中,可以有兩個類,它們的類名和包名都是相同的。類是由它的全名和類加載器來確定的。的類名和包名都是相同的。類是由它的全名和類加載器來確定的。這項技術(shù)在加載來自多處的代碼時很有用。例如,瀏覽器為每一這項技術(shù)在加載來自多處的代碼時很有用。例如,瀏覽器為每一個個web頁都使用了一個獨立的頁都使用了一個獨立的applet類加載器類的實例。這樣,虛類加載器類的實例。這樣,虛擬機就能區(qū)分來自不同擬機就能區(qū)分來自不同web頁的各個類,而不用管它們
25、的名字是頁的各個類,而不用管它們的名字是什么。什么。23編寫你自己的類加載器編寫你自己的類加載器n如果要編寫自己的類加載器,你只需要繼承如果要編寫自己的類加載器,你只需要繼承ClassLoader類,然后類,然后覆蓋下面這個方法覆蓋下面這個方法nfindClass(String className)nClassLoader超類的超類的loadClass方法用于將類的加載操作委托給其方法用于將類的加載操作委托給其父類加載器去進行,只有當(dāng)該類尚未加載并且父類加載器也無法父類加載器去進行,只有當(dāng)該類尚未加載并且父類加載器也無法加載該類時,才調(diào)用加載該類時,才調(diào)用findClass方法。方法。n如果要
26、實現(xiàn)該方法,你就必須:如果要實現(xiàn)該方法,你就必須:n為來自本地文件系統(tǒng)或者其他來源的類加載其字節(jié)碼。為來自本地文件系統(tǒng)或者其他來源的類加載其字節(jié)碼。n調(diào)用調(diào)用ClassLoader超類的超類的defineClass方法,向虛擬機提供字節(jié)碼。方法,向虛擬機提供字節(jié)碼。24編寫你自己的類加載器編寫你自己的類加載器n我們建立了一個類加載器,我們建立了一個類加載器,用于加載加密過的類文件。用于加載加密過的類文件。該程序要求用戶輸入第一個該程序要求用戶輸入第一個要加載的類的名字即包含要加載的類的名字即包含main方法的類和密鑰。然方法的類和密鑰。然后,使用一個專門的類加載后,使用一個專門的類加載器來加載
27、指定的類并調(diào)用器來加載指定的類并調(diào)用main方法。該類加載器對指方法。該類加載器對指定的類和所有被其引用的非定的類和所有被其引用的非系統(tǒng)類進行解密。最后,該系統(tǒng)類進行解密。最后,該程序調(diào)用已加載類的程序調(diào)用已加載類的main方方法。法。 25編寫你自己的類加載器編寫你自己的類加載器 class CryptoClassLoader extends ClassLoader /* Constructs a crypto class loader. param k the decryption key */ public CryptoClassLoader(int k) key = k; protec
28、ted 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.length); if (cl = null) throw new
29、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(., /) + .caesar; FileInputStream i
30、n = 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編寫你自己的類加載器編寫你自己的類加載器 private int key; 我們的我們的Caes
31、ar密碼版本使用的密鑰是從密碼版本使用的密鑰是從1255之間的一個數(shù)字,解密時,只需將密鑰之間的一個數(shù)字,解密時,只需將密鑰與每個字節(jié)相加,然后對與每個字節(jié)相加,然后對256取余。取余。Caesar.java程序就實現(xiàn)了這種加密行為。程序就實現(xiàn)了這種加密行為。為了不與通常的類加載器相混淆,我們對加密的類文件使用了不同的擴展名為了不與通常的類加載器相混淆,我們對加密的類文件使用了不同的擴展名.caesar。解密時,類加載器只需要將每個字節(jié)減去該密鑰即可。解密時,類加載器只需要將每個字節(jié)減去該密鑰即可。29編寫你自己的類加載器編寫你自己的類加載器 import java.io.*; /* Encr
32、ypts 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 FileOutputStream(args1); int key = Integer
33、.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, String key) try ClassLoader loader = new
34、 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對類文件進行加密有很大的用途當(dāng)然,使用的密碼的強度應(yīng)該對類文件進行加密有很
35、大的用途當(dāng)然,使用的密碼的強度應(yīng)該高于高于Caesar密碼),如果沒有加密密鑰,類文件就毫無用處。它密碼),如果沒有加密密鑰,類文件就毫無用處。它們既不能由標準虛擬機來執(zhí)行,也不能輕易地被反匯編。們既不能由標準虛擬機來執(zhí)行,也不能輕易地被反匯編。n這就是說,你可以使用定制的類加載器來認證類用戶的身份,或這就是說,你可以使用定制的類加載器來認證類用戶的身份,或者確保程序在運行之前已經(jīng)支付了軟件費用。當(dāng)然,加密只是定者確保程序在運行之前已經(jīng)支付了軟件費用。當(dāng)然,加密只是定制類加載器的應(yīng)用之一。你可以使用其他類型的加載器來解決別制類加載器的應(yīng)用之一。你可以使用其他類型的加載器來解決別的問題,例如,將
36、類文件存儲到數(shù)據(jù)庫中。的問題,例如,將類文件存儲到數(shù)據(jù)庫中。33編寫你自己的類加載器編寫你自己的類加載器njava.lang.Class 1.0 nClassLoader getClassLoader()n獲取加載該類的類加載器。獲取加載該類的類加載器。njava.lang.ClassLoader 1.0 nClassLoader getParent() 1.2n返回父類加載器,如果父類加載器是引導(dǎo)類加載器,則返回返回父類加載器,如果父類加載器是引導(dǎo)類加載器,則返回null。nstatic ClassLoader getSystemClassLoader() 1.2n獲取系統(tǒng)類加載器,即用于加
37、載第一個應(yīng)用類的類加載器。獲取系統(tǒng)類加載器,即用于加載第一個應(yīng)用類的類加載器。nprotected Class findClass(String name) 1.2n類加載器應(yīng)該覆蓋該方法,以查找類的字節(jié)碼,并通過調(diào)用類加載器應(yīng)該覆蓋該方法,以查找類的字節(jié)碼,并通過調(diào)用defineClass方法將字節(jié)碼傳給虛擬機。方法將字節(jié)碼傳給虛擬機。n參數(shù)參數(shù):nname類名類名; 使用使用 . 作為包名分隔符,并且不使用作為包名分隔符,并且不使用.class 后綴后綴34編寫你自己的類加載器編寫你自己的類加載器nClass defineClass(String name, byte data, int
38、offset, int length)n將一個新的類添加到虛擬機中。將一個新的類添加到虛擬機中。n參數(shù)參數(shù):nname類名類名; 使用使用 . 作為包名分隔符,并且不使用作為包名分隔符,并且不使用.class 后綴后綴 ndata用于存放該類字節(jié)碼的數(shù)組用于存放該類字節(jié)碼的數(shù)組noffset數(shù)組中字節(jié)碼的起始位置數(shù)組中字節(jié)碼的起始位置 nlength數(shù)組中字節(jié)碼的長度數(shù)組中字節(jié)碼的長度njava.lang.Thread 1.0nClassLoader getContextClassLoader() 1.2n獲取類加載器,該線程的創(chuàng)建者將其指定為執(zhí)行該線程時最適合使獲取類加載器,該線程的創(chuàng)建者將
39、其指定為執(zhí)行該線程時最適合使用的類加載器。用的類加載器。nvoid setContextClassLoader(ClassLoader loader) 1.2n為該線程中的代碼設(shè)置一個類加載器,以獲取要加載的類。如果在為該線程中的代碼設(shè)置一個類加載器,以獲取要加載的類。如果在啟動一個線程時沒有顯式地設(shè)置上下文類加載器,則使用父線程的啟動一個線程時沒有顯式地設(shè)置上下文類加載器,則使用父線程的上下文類加載器。上下文類加載器。35內(nèi)容提要內(nèi)容提要n類加載器類加載器n字節(jié)碼校驗字節(jié)碼校驗n安全管理器與訪問權(quán)限安全管理器與訪問權(quán)限n數(shù)字簽名數(shù)字簽名n代碼簽名代碼簽名n加密加密36字節(jié)碼校驗字節(jié)碼校驗n當(dāng)
40、類加載器將新加載的當(dāng)類加載器將新加載的Java平臺類的字節(jié)碼傳遞給虛擬機時,這平臺類的字節(jié)碼傳遞給虛擬機時,這些字節(jié)碼首先要接受些字節(jié)碼首先要接受“校驗器校驗器verifier)”的校驗。校驗器負責(zé)的校驗。校驗器負責(zé)檢查那些指令無法執(zhí)行的明顯有破壞性的操作。除了系統(tǒng)類外,檢查那些指令無法執(zhí)行的明顯有破壞性的操作。除了系統(tǒng)類外,所有的類都要被校驗,不過,你可以使用非正式的所有的類都要被校驗,不過,你可以使用非正式的-noverify選項選項來鈍化校驗。來鈍化校驗。n例如,你可以使用下面的命令行:例如,你可以使用下面的命令行:njava -noverify Hello37字節(jié)碼校驗字節(jié)碼校驗n下面
41、是校驗器執(zhí)行的一些檢查:下面是校驗器執(zhí)行的一些檢查:n變量要在使用之前進行初始化。變量要在使用之前進行初始化。n方法調(diào)用與對象引用類型之間要匹配。方法調(diào)用與對象引用類型之間要匹配。n訪問私有數(shù)據(jù)和方法的規(guī)則沒有被違反。訪問私有數(shù)據(jù)和方法的規(guī)則沒有被違反。n對本地變量的訪問都在運行時堆棧內(nèi)。對本地變量的訪問都在運行時堆棧內(nèi)。n運行時堆棧沒有溢出。運行時堆棧沒有溢出。n如果以上這些檢查中任何一條沒有通過,那么該類就被認為遭到如果以上這些檢查中任何一條沒有通過,那么該類就被認為遭到了破壞,并且不予加載。了破壞,并且不予加載。38字節(jié)碼校驗字節(jié)碼校驗n這種嚴格的校驗是出于安全上的考慮這種嚴格的校驗是出
42、于安全上的考慮n通過修改運行時堆棧中的值,或者向系統(tǒng)對象的私有數(shù)據(jù)字段寫通過修改運行時堆棧中的值,或者向系統(tǒng)對象的私有數(shù)據(jù)字段寫入數(shù)據(jù),某個程序就會突破瀏覽器的安全防線。入數(shù)據(jù),某個程序就會突破瀏覽器的安全防線。n用用Java語言編譯器生成的類文件總是可以通過校驗的。語言編譯器生成的類文件總是可以通過校驗的。n校驗器總是在防范被故意篡改的類文件,而不僅僅只是檢查編譯校驗器總是在防范被故意篡改的類文件,而不僅僅只是檢查編譯器產(chǎn)生的類文件。器產(chǎn)生的類文件。39字節(jié)碼校驗字節(jié)碼校驗n下面的例子將展示如何創(chuàng)建一個變動過的類文件。我們從示例程下面的例子將展示如何創(chuàng)建一個變動過的類文件。我們從示例程序序V
43、erifierTest.java開始。這是一個簡單的程序,它調(diào)用一個方法,開始。這是一個簡單的程序,它調(diào)用一個方法,并且顯示方法的運行結(jié)果。該程序既可以在控制臺運行,也可以并且顯示方法的運行結(jié)果。該程序既可以在控制臺運行,也可以作為一個作為一個Applet程序來運行。其中的程序來運行。其中的fun方法本身只是負責(zé)計算方法本身只是負責(zé)計算1+2。nstatic int fun()nn int m;n int n;n m = 1;n n = 2;n int r = m + n;n return r;n40字節(jié)碼校驗字節(jié)碼校驗n作為一次實驗,請嘗試編譯下面這個對該程序進行修改后的文件。作為一次實驗,
44、請嘗試編譯下面這個對該程序進行修改后的文件。nstatic int fun()nn int m = 1;n int n;n m = 1;n m = 2;n int r = m + n;n return r;n41字節(jié)碼校驗字節(jié)碼校驗n在這種情況下,在這種情況下,n沒有被初始化,它可以是任何隨機值。當(dāng)然,沒有被初始化,它可以是任何隨機值。當(dāng)然,編譯器能夠檢測到這個問題并拒絕編譯該程序。如果要建立一個編譯器能夠檢測到這個問題并拒絕編譯該程序。如果要建立一個不良的類文件,我們必須得多花點功夫。首先,運行不良的類文件,我們必須得多花點功夫。首先,運行javap程序,程序,以便知曉編譯器是如何翻譯以便知
45、曉編譯器是如何翻譯fun方法的。下面這個命令方法的。下面這個命令njavap -c VerifierTestn用助記用助記mnemonic格式顯示了類文件中的字節(jié)碼。格式顯示了類文件中的字節(jié)碼。42字節(jié)碼校驗字節(jié)碼校驗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字節(jié)碼校驗字節(jié)碼校驗n我們使用一個十六進制編輯器將指令我們使用一個十六進制編輯器將指令3從從istore_1改為改為istore_0,也,也就
46、是說,局部變量就是說,局部變量0即即m被初始化了兩次,而局部變量被初始化了兩次,而局部變量1即即n則根本沒有初始化。則根本沒有初始化。n0 iconst_1 04n1 istore_0 3Bn2 iconst_2 05n3 istore_1 3Cn4 iload_0 1An5 iload_1 1Bn6 iadd 60n7 istore_2 3Dn8 iload_2 1Cn9 ireturn AC44字節(jié)碼校驗字節(jié)碼校驗n你可以使用十六進制編輯器你可以使用十六進制編輯器例如例如DataWorkshop,可以,可以從從dataworkshop.de處下載處下載來進行修改操作。當(dāng)然,你來進行修改操作
47、。當(dāng)然,你也可以使用也可以使用hexl-mode的的emacs進行修改。在左圖中,進行修改。在左圖中,你可以看到類文件你可以看到類文件VerifierTest.class被加載到了被加載到了DataWorkshop編輯器中,編輯器中,fun方法的字節(jié)碼已經(jīng)被選定方法的字節(jié)碼已經(jīng)被選定。45字節(jié)碼校驗字節(jié)碼校驗n將將3C改為改為3B并保存類文件。然后設(shè)法運行并保存類文件。然后設(shè)法運行VerifierTest程序。你程序。你將會看到下面的出錯信息:將會看到下面的出錯信息:n Exception in thread main java.lang.VerifyError: (class: Verifi
48、erTest, method:fun signature: ()I) Accessing value from uninitialized register 1n這很好,虛擬機發(fā)現(xiàn)了我們所做的修改。這很好,虛擬機發(fā)現(xiàn)了我們所做的修改。46字節(jié)碼校驗字節(jié)碼校驗n現(xiàn)在用現(xiàn)在用-noverify選項或者選項或者-Xverify:none來運行程序:來運行程序:njava -noverify VerifierTestn從表面上看,從表面上看,fun方法似乎返回了一個隨機值。但實際上,該值方法似乎返回了一個隨機值。但實際上,該值是是2與存儲在尚未初始化的變量與存儲在尚未初始化的變量n中的值相加得到的結(jié)果
49、。下面是中的值相加得到的結(jié)果。下面是典型的輸出結(jié)果:典型的輸出結(jié)果:n1 + 2 = 1510233047內(nèi)容提要內(nèi)容提要n類加載器類加載器n字節(jié)碼校驗字節(jié)碼校驗n安全管理器與訪問權(quán)限安全管理器與訪問權(quán)限n數(shù)字簽名數(shù)字簽名n代碼簽名代碼簽名n加密加密48安全管理器與訪問權(quán)限安全管理器與訪問權(quán)限n安全管理器是一個負責(zé)控制某個操作是否允許執(zhí)行的類。安全管安全管理器是一個負責(zé)控制某個操作是否允許執(zhí)行的類。安全管理器負責(zé)檢查的操作包括以下幾個:理器負責(zé)檢查的操作包括以下幾個:n當(dāng)前線程是否能夠創(chuàng)建一個新的類加載器;當(dāng)前線程是否能夠創(chuàng)建一個新的類加載器;n當(dāng)前線程是否能夠中止虛擬機的運行;當(dāng)前線程是否能
50、夠中止虛擬機的運行;n某個類是否能夠訪問另一個類的成員;某個類是否能夠訪問另一個類的成員;n當(dāng)前線程是否能夠訪問本地文件;當(dāng)前線程是否能夠訪問本地文件;n當(dāng)前線程是否能夠打開到達外部主機的當(dāng)前線程是否能夠打開到達外部主機的socket連接;連接;n某個類是否能夠啟動打印作業(yè);某個類是否能夠啟動打印作業(yè);n某個類是否能夠訪問系統(tǒng)剪貼板;某個類是否能夠訪問系統(tǒng)剪貼板;n某個類是否能夠訪問某個類是否能夠訪問AWT事件隊列;事件隊列;n當(dāng)前線程是否可被信任以打開一個頂層窗口。當(dāng)前線程是否可被信任以打開一個頂層窗口。n整個整個Java類庫中還有許多其他類似的檢查。類庫中還有許多其他類似的檢查。49安全管
51、理器與訪問權(quán)限安全管理器與訪問權(quán)限n在運行在運行Java應(yīng)用程序時,缺省的設(shè)置是不安裝安全管理器的,這應(yīng)用程序時,缺省的設(shè)置是不安裝安全管理器的,這樣所有的操作都是允許的。另一方面,樣所有的操作都是允許的。另一方面,applet瀏覽器都直接地安瀏覽器都直接地安裝了一個功能受限的安全管理器。裝了一個功能受限的安全管理器。n例如,例如,applet不允許退出虛擬機。如果它們試圖調(diào)用不允許退出虛擬機。如果它們試圖調(diào)用exit方法,就方法,就會拋出一個安全異常。下面將詳細說明這種情況。會拋出一個安全異常。下面將詳細說明這種情況。Runtime類的類的exit方法調(diào)用安全管理器的方法調(diào)用安全管理器的ch
52、eckExit方法,下面是方法,下面是exit方法的全部方法的全部代碼:代碼:npublic void exit(int status)nn SecurityManager security = System.getSecurityManager();n if (security != null)n security.checkExit(status);n exitInternal(status);n50安全管理器與訪問權(quán)限安全管理器與訪問權(quán)限n如果安全管理器不同意退出請求,那么如果安全管理器不同意退出請求,那么checkExit方法就會拋出一方法就會拋出一個個SecurityExceptio
53、n異常。異常。n只有當(dāng)沒有任何異常發(fā)生時,只有當(dāng)沒有任何異常發(fā)生時,exit方法才能繼續(xù)執(zhí)行。然后它調(diào)方法才能繼續(xù)執(zhí)行。然后它調(diào)用本地私有的用本地私有的exitInternal方法,實際終止虛擬機的運行。沒有其方法,實際終止虛擬機的運行。沒有其他的方法可以終止虛擬機的運行,因為他的方法可以終止虛擬機的運行,因為exitInternal方法是私有的,方法是私有的,任何其他類都不能調(diào)用它。因而,任何試圖退出虛擬機的代碼都任何其他類都不能調(diào)用它。因而,任何試圖退出虛擬機的代碼都必須通過必須通過exit方法,從而在不觸發(fā)安全異常的情況下,通過方法,從而在不觸發(fā)安全異常的情況下,通過checkExit安
54、全檢查。安全檢查。n顯然,安全策略的完整性依賴于謹慎的編碼。標準類庫中系統(tǒng)服顯然,安全策略的完整性依賴于謹慎的編碼。標準類庫中系統(tǒng)服務(wù)的提供者,在試圖繼續(xù)任何敏感的操作之前,都必須認真地與務(wù)的提供者,在試圖繼續(xù)任何敏感的操作之前,都必須認真地與安全管理器進行協(xié)商。安全管理器進行協(xié)商。51安全管理器與訪問權(quán)限安全管理器與訪問權(quán)限n你的程序可以調(diào)用你的程序可以調(diào)用System類的靜態(tài)類的靜態(tài)setSecurityManager方法來安方法來安裝一個特定的安全管理器。一旦程序安裝了安全管理器,如果再裝一個特定的安全管理器。一旦程序安裝了安全管理器,如果再試圖安裝第二個安全管理器,那么只有當(dāng)原安全管理
55、器同意被替試圖安裝第二個安全管理器,那么只有當(dāng)原安全管理器同意被替換時,第二個才能成功安裝。換時,第二個才能成功安裝。nJava 2 平臺的缺省安全管理器,不僅允許系統(tǒng)管理員,而且允許平臺的缺省安全管理器,不僅允許系統(tǒng)管理員,而且允許程序員對各個安全訪問權(quán)限實施細致的控制。程序員對各個安全訪問權(quán)限實施細致的控制。Java 2 平臺的安全平臺的安全模型使用策略文件對各個權(quán)限實施控制。我們可以定義自己的權(quán)模型使用策略文件對各個權(quán)限實施控制。我們可以定義自己的權(quán)限類型,以及擴展缺省的安全管理器類。限類型,以及擴展缺省的安全管理器類。52Java安全架構(gòu)安全架構(gòu)-JDK1.0外來代碼只能在沙盒外來代碼
56、只能在沙盒Sandbox中運行中運行53Java安全架構(gòu)安全架構(gòu)-JDK1.1通過數(shù)字簽名的遠程代碼可以如本地通過數(shù)字簽名的遠程代碼可以如本地代碼一樣在沙盒外運行代碼一樣在沙盒外運行54Java 2 平臺安全性平臺安全性nJava 2 平臺則擁有更靈平臺則擁有更靈活的安全機制,它的安活的安全機制,它的安全策略建立了代碼來源全策略建立了代碼來源和訪問權(quán)限集合之間的和訪問權(quán)限集合之間的映射關(guān)系映射關(guān)系 55Java安全架構(gòu)安全架構(gòu)-JDK1.2以上以上n不區(qū)分本地和遠程代碼不區(qū)分本地和遠程代碼n概念:概念:policypolicy、permissionspermissions、domainsdom
57、ains56Java 2 平臺安全性平臺安全性n代碼來源代碼來源code source包含兩個屬性,一個是代碼位置例如,包含兩個屬性,一個是代碼位置例如,遠程代碼的遠程代碼的HTTP URL,或者,或者JAR文件中本地代碼的文件文件中本地代碼的文件URL),),另一個是證書。另一個是證書。n權(quán)限權(quán)限(permission)是指由安全管理器負責(zé)檢查的任何屬性。是指由安全管理器負責(zé)檢查的任何屬性。JDK 1.2 支持許多訪問權(quán)限類,每個類都封裝了特定權(quán)限的詳細信息。支持許多訪問權(quán)限類,每個類都封裝了特定權(quán)限的詳細信息。例如,下面這個例如,下面這個FilePermission類的實例規(guī)定,它能夠在類
58、的實例規(guī)定,它能夠在/tmp目錄目錄下讀取和寫入任何文件。下讀取和寫入任何文件。nFilePermission p = new FilePermission(/tmp/*, read,write);n更為重要的是,更為重要的是,JDK 1.2中的中的Policy類的缺省實現(xiàn)可從訪問權(quán)限文類的缺省實現(xiàn)可從訪問權(quán)限文件中讀取權(quán)限。在權(quán)限文件中,同樣的讀權(quán)限表示為:件中讀取權(quán)限。在權(quán)限文件中,同樣的讀權(quán)限表示為:npermission java.io.FilePermission /tmp/*, read,write;57Java 2 平臺安全性平臺安全性n左圖顯示了左圖顯示了JDK 1.2中中提供
59、的權(quán)限提供的權(quán)限類的層次結(jié)類的層次結(jié)構(gòu)。構(gòu)。JDK的的后續(xù)版本添后續(xù)版本添加了更多的加了更多的權(quán)限類。權(quán)限類。 58Java 2 平臺安全性平臺安全性n當(dāng)當(dāng)SecurityManager類需要檢查某個權(quán)限時,它要查看當(dāng)前位于類需要檢查某個權(quán)限時,它要查看當(dāng)前位于調(diào)用堆棧上的所有方法的類,然后它要獲得所有類的保護域,并調(diào)用堆棧上的所有方法的類,然后它要獲得所有類的保護域,并且詢問每個保護域,該域的權(quán)限集合是否允許執(zhí)行當(dāng)前正在被檢且詢問每個保護域,該域的權(quán)限集合是否允許執(zhí)行當(dāng)前正在被檢查的操作。如果所有的域都同意,那么檢查得以通過。否則,就查的操作。如果所有的域都同意,那么檢查得以通過。否則,就會
60、拋出一個會拋出一個SecurityException異常。異常。n為什么在調(diào)用堆棧上的所有方法都必須允許某個特定的操作呢?為什么在調(diào)用堆棧上的所有方法都必須允許某個特定的操作呢?讓我們通過一個實例來說明這個問題。假設(shè)一個讓我們通過一個實例來說明這個問題。假設(shè)一個applet的的init方法方法想要打開一個文件,它可以會調(diào)用下面的語句:想要打開一個文件,它可以會調(diào)用下面的語句:nReader in = new FileReader(name);59Java 2 平臺安全性平臺安全性nFileReader構(gòu)造器調(diào)用構(gòu)造器調(diào)用FileInputStream構(gòu)造器,而構(gòu)造器,而FileInputStream構(gòu)構(gòu)造器調(diào)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年北京賽瑞斯國際工程咨詢有限公司招聘備考題庫及一套完整答案詳解
- 2026年上海城建隧道裝備有限公司招聘備考題庫及完整答案詳解1套
- 2026年興賓區(qū)鳳凰鎮(zhèn)北五衛(wèi)生院公開招聘編外聘用人員備考題庫及參考答案詳解
- 2026年咸寧市婦幼保健院人才引進備考題庫帶答案詳解
- 2026年吳川市公開招聘大學(xué)生鄉(xiāng)村醫(yī)生28人備考題庫及完整答案詳解1套
- 2026年成都市雙流區(qū)怡心第八幼兒園招聘備考題庫及1套參考答案詳解
- 2026年天津市北方人力資源管理顧問有限公司派遣制員工招聘需求備考題庫及完整答案詳解一套
- 2026年上海中遠海運資訊科技有限公司招聘備考題庫及答案詳解一套
- 2026年成都市新都區(qū)部分單位公開招聘編外(聘用)人員7人的備考題庫(二)完整參考答案詳解
- 2026年富源縣第七中學(xué)招聘臨聘教師備考題庫及答案詳解一套
- 2025檢驗科個人年終工作總結(jié)
- 救護車急救護理查房
- 工程竣工移交單(移交甲方、物業(yè))
- 交熟食技術(shù)協(xié)議書
- 靜脈采血不良事件分析與改進
- JJF 2216-2025電磁流量計在線校準規(guī)范
- 2024-2025學(xué)年廣東省深圳市福田區(qū)六年級(上)期末數(shù)學(xué)試卷
- 發(fā)改價格〔2007〕670號建設(shè)工程監(jiān)理與相關(guān)服務(wù)收費標準
- 道岔滾輪作用原理講解信號設(shè)備檢修作業(yè)課件
- 小學(xué)師徒結(jié)對師傅工作總結(jié)
- 廉潔征兵培訓(xùn)課件
評論
0/150
提交評論