java學(xué)習(xí)心得筆記
關(guān)。
以下是你應(yīng)該回避使用的一些java特色,并且在你的ejb組件的實(shí)現(xiàn)代碼中要嚴(yán)格限
制它們的使用:
1.使用static,非final 字段。建議你在ejb組件中把所有的static字段都聲明為final型的。這樣可以保證前后一致的運(yùn)行期語(yǔ)義,使得ejb容器有可以在多個(gè)java虛擬機(jī)之間分發(fā)組件實(shí)例的靈活性。
2.使用線程同步原語(yǔ)來(lái)同步多個(gè)組件實(shí)例的運(yùn)行。避免這個(gè)問(wèn)題,你就可以使ejb容器靈活的在多個(gè)java虛擬機(jī)之間分發(fā)組件實(shí)例。
3.使用awt函數(shù)完成鍵盤的輸入和顯示輸出。約束它的原因是服務(wù)器方的商業(yè)組件意味著提供商業(yè)功能而不包括用戶界面和鍵盤的i/o功能。
4.使用文件訪問(wèn)/java.io 操作。ejb商業(yè)組件意味著使用資源管理器如jdbc來(lái)存儲(chǔ)和檢索數(shù)據(jù)而不是使用文件系統(tǒng)api。同時(shí),部署工具提供了在部署描述器(descriptor)中存儲(chǔ)環(huán)境實(shí)體,以至于ejb組件可以通過(guò)環(huán)境命名上下文用一種標(biāo)準(zhǔn)的方法進(jìn)行環(huán)境實(shí)體查詢。所以,使用文件系統(tǒng)的需求基本上是被排除了。
5.監(jiān)聽(tīng)和接收socket連接,或者用socket進(jìn)行多路發(fā)送。ejb組件并不意味著提供網(wǎng)絡(luò)socket服務(wù)器功能,但是,這個(gè)體系結(jié)構(gòu)使得ejb組件可以作為socket客戶或是rmi客戶并且可以和容器所管理的環(huán)境外面的代碼進(jìn)行通訊。
6.使用映象api查詢ejb組件由于安全規(guī)則所不能訪問(wèn)的類。這個(gè)約束加強(qiáng)了java平臺(tái)的安全性。
7.欲創(chuàng)建或獲得一個(gè)類的加載器,設(shè)置或創(chuàng)建一個(gè)新的安全管理器,停止java虛擬機(jī),改變輸入、輸出和出錯(cuò)流。這個(gè)約束加強(qiáng)了安全性同時(shí)保留了ejb容器管理運(yùn)行環(huán)境的能力。
8.設(shè)置socket工廠被url's serversocket,socket和stream handler使用。避免這個(gè)特點(diǎn),可以加強(qiáng)安全性同時(shí)保留了ejb容器管理運(yùn)行環(huán)境的能力。
9.使用任何方法啟動(dòng)、停止和管理線程。這個(gè)約束消除了與ejb容器管理死鎖、線程
和并發(fā)問(wèn)題的責(zé)任相沖突的可能性。
通過(guò)限制使用10-16幾個(gè)特點(diǎn),你的目標(biāo)是堵上一個(gè)潛在的安全漏洞:
10.直接讀寫文件描述符。
11.為一段特定的代碼獲得安全策略信息。
12.加載原始的類庫(kù)。
13.訪問(wèn)java一般角色所不能訪問(wèn)的包和類。
14.在包中定義一個(gè)類。
15.訪問(wèn)或修改安全配置對(duì)象(策略、安全、提供者、簽名者和實(shí)體)。
16.使用java序列化特點(diǎn)中的細(xì)分類和對(duì)象替代。
17.傳遞this引用指針作為一個(gè)參數(shù)或者作為返回值返回this引用指針。你必須使用
sessioncontext或entitycontext中的getejbobject()的結(jié)果。
java2平臺(tái)的安全策略
以上所列的特點(diǎn)事實(shí)上正是java編程語(yǔ)言和java2標(biāo)準(zhǔn)版中的標(biāo)準(zhǔn)的、強(qiáng)有力的特色。ejb容器允許從j2se中使用一些或全部的受限制的特色,盡管對(duì)于ejb組件是不可用的,但需通過(guò)j2se的安全機(jī)制來(lái)使用而不是通過(guò)直接使用j2se的api。
java2平臺(tái)為ejb1.1規(guī)范中的ejb容器所制定的安全策略定義了安全許可集,這些許可在ejb組件的編程限制中出現(xiàn)。通過(guò)這個(gè)策略,定義了一些許可諸如:java.io.filepermission,.netpermission,java.io.reflect.reflectpermission,java.lang.security.securitypermission,以便加強(qiáng)先前所列出的編程限制。
許多ejb容器沒(méi)有加強(qiáng)這些限制,他們希望ejb組件開(kāi)發(fā)者能遵守這些編程限制或者是帶有冒險(xiǎn)想法違背了這些限制。違背這些限制的ejb組件,比標(biāo)準(zhǔn)方法依賴過(guò)多或過(guò)少的安全許可,都將很少能在多個(gè)ejb容器間移植。另外,代碼中都將隱藏著一些不確定的、難以預(yù)測(cè)的問(wèn)題。所有這些都足以使ejb組件開(kāi)發(fā)者應(yīng)該知道這些編程限制,同時(shí)也應(yīng)該認(rèn)真地遵守它們。
任何違背了這些編程限制的ejb組件的實(shí)現(xiàn)代碼在編譯時(shí)都不能檢查出來(lái),因?yàn)檫@些特點(diǎn)都是java語(yǔ)言和j2se中不可缺少的部分。
對(duì)于ejb組件的這些限制同樣適用于ejb組件所使用的幫助/訪問(wèn)(helper/access)類,j2ee應(yīng)用程序使用java文檔(jar)文件格式打包到一個(gè)帶.ear(代表enterprise archive)擴(kuò)展名的文件中,這個(gè)ear文件對(duì)于發(fā)送給文件部署器來(lái)說(shuō)是標(biāo)準(zhǔn)的格式。ear文件中包括在一個(gè)或多個(gè)ejb-jar文件中的ejb組件,還可能有ejb-jar所依賴的庫(kù)文件。所有ear文件中的代碼都是經(jīng)過(guò)深思熟慮開(kāi)發(fā)的應(yīng)用程序并且都遵守編程限制和訪問(wèn)許可集。
未來(lái)版本的規(guī)范可能會(huì)指定通過(guò)部署工具來(lái)定制安全許可的能力,通過(guò)這種方法指定了一個(gè)合法的組件應(yīng)授予的許可權(quán)限,也指定了一個(gè)標(biāo)準(zhǔn)方法的需求:如從文件系統(tǒng)中讀文件應(yīng)有哪些要求。一些ejb容器/服務(wù)器目前在它們的部署工具中都提供了比標(biāo)準(zhǔn)權(quán)限或多或少的許可權(quán)限,這些并不是ejb1.1規(guī)范中所需要的。
理解這些約束
ejb容器是ejb組件生存和執(zhí)行的運(yùn)行期環(huán)境,ejb容器為ejb組件實(shí)例提供了一些服務(wù)如:事務(wù)管理、安全持久化、資源訪問(wèn)、客戶端連接。ejb容器也負(fù)責(zé)ejb組件實(shí)例整個(gè)生命期的管理、擴(kuò)展問(wèn)題以及并發(fā)處理。所以,ejb組件就這樣寄居在一個(gè)被管理的執(zhí)行環(huán)境中--即ejb容器。
因?yàn)閑jb容器完全負(fù)責(zé)ejb組件的生命期、并發(fā)處理、資源訪問(wèn)、安全等等,所以與容器本身的鎖定和并發(fā)管理相沖突的可能性就需要消除,許多限制都需要使用來(lái)填上潛在的安全漏洞。除了與ejb容器責(zé)任與安全沖突的問(wèn)題,ejb組件還意味著僅僅聚焦于商務(wù)邏輯,它依賴于ejb容器所提供的服務(wù)而不是自己來(lái)直接解決底層的系統(tǒng)層的問(wèn)題。