網站首頁 工作範例 辦公範例 個人範例 黨團範例 簡歷範例 學生範例 其他範例 專題範例

java學習心得筆記

欄目: 讀書筆記 / 釋出於: / 人氣:2.56W

j2ee學習筆記

java學習心得筆記

注:框架可以用word選單中的 “檢視/文件結構圖” 看到

j2ee模式

value object(值物件) 用於把資料從某個物件/層傳遞到其他物件/層的任意java物件。

通常不包含任何業務方法。

也許設計有公共屬性,或者提供可以獲取屬性值的get方法。

jsp

1.jsp的基礎知識

__

_____ | directive (指令)

| |-- scripting (指令碼)

jsp -------| |__ action (動作)

|

|_____template data :除jsp語法外,jsp引擎不能解讀的東西

1)在jsp中使用的directive(指令)主要有三個:

a) page指令

b) include指令

c) taglib指令

在jsp的任何地方,以任何順序,一個頁面可以包含任意數量的page指令

2)scripting(指令碼)包括三種類型

a) <%!declaraction %>;

b) <% scriptlet %>;

c) <%= expression %>;

3)action(動作)

標準的動作型別有:

a) <jsp:usebean>;

b) <jsp:setproperty>;

d) <jsp:getproperty>;

e) <jsp:param>;

f) <jsp:include>;

g) <jsp:forward>;

h) <jsp:plugin>;

1. 註釋: <% -----jsp comment-------%>;

<! -----html comment-------%>;

2. <%@ page session = “true” import =”.*” %>;

session可以不賦值,預設為true,如果session=”false”,則在jsp頁面中,隱含的變數session就不能使用。

3. 請求控制器結構(request controller)

也被稱之為jsp model 2 architecture

這種途徑涉及到使用一個servlet或一個jsp作為一個應用程式或一組頁面的入口點。

為建立可維護的jsp系統,request controller是最有用的方式之一。

不是jsp,而是java類才是放置控制邏輯的正確的地方。

請求控制器的命名模式為:

請求控制器類的命名模式為: xxxrequestcontroller

2.jsp中的javabean

jsp三種bean的型別

1) 頁面bean

2) 會話bean

3) 應用bean

大多數的系統會使用一個會話bean來保持狀態,而對每一個頁面使用一個頁面bean 來對複雜的資料進行表示。

頁面bean是一個模型,而jsp是一個檢視。

3.custom tag

bean是資訊的攜帶者,

而tag更適用於處理資訊。

標記庫包含一個標記庫描述符(tld)和用於實現custom tag的java類

在翻譯階段,jsp容器將使用tld來驗證頁面中的所有的tag是否都被正確的使用。

標記處理程式只是一個簡單的介面卡,而真正的邏輯是在另一個類中實現的,標記處理程式只是提供了一個供其他的可複用的類的jsp介面

servlet

1.servletconfig

&#61548; 一個servletconfig物件是servlet container在servlet initialization的時候傳遞給servlet的。

servletconfig包涵 servletcontext 和 一些 name/value pair (來自於deployment descriptor)

&#61548; servletcontext介面封裝了web應用程式的上下文概念。

2.會話跟蹤

1) session

&#61548; 當一個client請求多個servlets時,一個session可以被多個servlet共享。

&#61548; 通常情況下,如果server detect到browser支援cookie,那麼url就不會重寫。

2) cookie

&#61548; 在java servlet中,如果你光 cookie cookie = new cookie(name,value)

那麼當用戶退出browser時,cookie會被刪除掉,而不會被儲存在客戶端的硬碟上。

如果要儲存 cookie,需加一句 axage(200)

&#61548; cookie是跟某一個server相關的,執行在同一個server上的servlet共享一個cookie.

3) url rewriting

在使用url rewriting來維護session id的時候,每一次http請求都需要encodeurl()

典型的用在兩個地方

1) t(“form action=” ”);

t(deurl(“sessionexample”));

t(“form action=” ”);

t(“method = get>;”);

2) t(“<p>;<a href=” ”);

t(deurl(“sessionexample?database=foo&datavalue=bar”));

tln(“” >;url encoded </a>;”);

3.singlethreadmodel

預設的,每一個servlet definition in a container只有一個servlet class的例項。

只有實現了singlethreadmodel,container才會讓servlet有多個例項。

servlet specification上建議,不要使用synchronized,而使用singlethreadmodel。

singlethreadmodel(沒有方法)

保證servlet在同一時刻只處理一個客戶的請求。

singlethreadmodel是耗費資源的,特別是當有大量的請求傳送給servlet時,singlethreadmodel的作用是使包容器以同步時鐘的方式呼叫service方法。

這等同於在servlet的service()方法種使用synchronized.

single thread model一般使用在需要響應一個heavy request的時候,比如是一個需要和資料庫打交道的連線。

2. 在過載servlet地init( )方法後,一定要記得呼叫( );

3. the client通過傳送一個blank line表示它已經結束request

而the server通過關閉the socket來表示response已結束了。

4. 一個http servlet可以送三種東西給client

1) a single status code

2) any number of http headers

3) a response body

5. servlet之間資訊共享的一個最簡單的方法就是

roperties()(“key”,”value”);

6. post和get

post:將form內各欄位名稱和內容放置在html header內傳送給server

get: ?之後的查詢字串要使用urlencode,經過urlencode後,這個字串不再帶有空格,以後將在server上恢復所帶有的空格。

get是web上最經常使用的一種請求方法,每個超連結都使用這種方法。

7. 就是web applicatin 的deployment descriptor

作用有:組織各類元素

設定init param

設定安全性

8. request dispatcher用來把接收到的request forward processing到另一個servlet

要在一個response裡包含另一個servlet的output時,也要用到request dispatcher.

9. servlet和jsp在同一個jvm中,可以通過serveltcontext的

setattribute( )

getattribute( )

removeattribute( )

來共享物件

10. 利用arameter( )得到的string存在字符集問題。

可以用 strtitle = arameter(“title”);

strtitle = new string(ytes(“8859-1”),”gb2312”);

如果你希望得到更大得相容性

string encoding = haracterencoding();

//確定application server用什麼編碼來讀取輸入的。

strtitle = new string(ytes(encoding),”gb2312”);

xml

1.xml基礎知識

1. 一個xml文件可以分成兩個基本部分:

首部( header )

內容( content )

2. xml名字空間規範中指定:

xml文件中的每一個元素都處在一個名字空間中;如果沒有指定的名字空間,預設的名字空間就是和該元素相關聯的名字空間。

3. a document that is well-formed obeys all of the rules of xml documents (nested tags, etc.)

" if a well-formed document uses a document type definition (more on these in a minute), and it follows all the rules of the dtd, then it is also a valid document

4. a tag is the text between the <angle brackets>;

" an element is the start tag, the end tag,and everything (including other elements) in between

5. 標籤( tags ) 實際上包含了“元素”( elements ) 和 “屬性”( attributes )兩部分。

用元素( elements )來描述有規律的資料。

用屬性( attributes ) 來描述系統資料。

如果你有一些資料要提供給某個應用程式,該資料就可能要用到一個元素。

如果該資料用於分類,或者用於告知應用程式如何處理某部分資料,或者該資料從來沒有直接對客戶程式公開,那麼它就可能成為一種屬性。

6. cdata (讀作:c data ) c是character的縮寫。

er

/|

eader

/|

arser

2.webservice

2.1 webservice的基本概念

webservice是一種可以接收從internet或者intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。

這種技術允許網路上的所有系統進行互動。隨著技術的發展,一個web服務可以包含額外的指定功能並且可以在多個b2b應用中協作通訊。

web服務可以理解請求中上下文的關係,並且在每一個特定的情況下產生動態的結果。這些服務會根據使用者的身份,地點以及產生請求的原因來改變不同的處理,用以產生一個唯一的,定製的方案。這種協作機制對那些只對最終結果有興趣的使用者來說,是完全透明的。

uddi

在使用者能夠呼叫web服務之前,必須確定這個服務內包含哪些商務方法,找到被呼叫的介面定義,還要在服務端來編制軟體。所以,我們需要一種方法來發布我們的web服務。

uddi (universal description, discovery, and integration) 是一個主要針對web服務供應商和使用者的新專案。uddi 專案中的成員可以通過uddi business registry (ubr) 來操作web服務的呼叫,ubr是一個全球性的服務。

web服務供應商可以在ubr中描述並且註冊他們的服務。

使用者可以在ubr中查詢並定位那些他們需要的服務。

uddi是一種根據描述文件來引導系統查詢相應服務的機制。

uddi包含標準的“白皮書”型別的商業查詢方式,

“黃皮書”型別的區域性查詢,以及

“綠皮書”型別的服務型別查詢。

uddi利用soap訊息機制(標準的xml/http)來發布,編輯,瀏覽以及查詢註冊資訊。它採用xml格式來封裝各種不同型別的資料,並且傳送到註冊中心或者由註冊中心來返回需要的資料。

wsdl

對於商業使用者來說,要找到一個自己需要使用的服務,他必須知道如何來呼叫。

wsdl (web services description language) 規範是一個描述介面,語義以及web服務為了響應請求需要經常處理的工作的xml文件。這將使簡單地服務方便,快速地被描述和記錄。

以下是一個wsdl的樣例:

<?xml version="1.0"?>;

<definitions name="stockquote"

;

;

<types>;

<element name="tradepricerequest">;

<complextype>;

<all>;

<element name="tickersymbol" type="string"/>;

</all>;

</complextype>;

</element>;

<element name="tradeprice">;

<complextype>;

<all>;

<element name="price" type="float"/>;

</all>;

</complextype>;

</element>;

</schema>;

</types>;

<message name="getlasttradepriceinput">;

<part name="body" element="xsd1:tradepricerequest"/>;

</message>;

<message name="getlasttradepriceoutput">;

<part name="body" element="xsd1:tradeprice"/>;

</message>;

<porttype name="stockquoteporttype">;

<operation name="getlasttradeprice">;

<input message="tns:getlasttradepriceinput"/>;

<output message="tns:getlasttradepriceoutput"/>;

</operation>;

</porttype>;

<binding name="stockquotesoapbinding"

type="tns:stockquoteporttype">;

<soap:binding style="document"

<operation name="getlasttradeprice">;

<soap:operation

<input>;

<soap:body use="literal"/>;

</input>;

<output>;

<soap:body use="literal"/>;

</output>;

</operation>;

</binding>;

<service name="stockquoteservice">;

<documentation>;my first service</documentation>;

<port name="stockquoteport" binding="tns:stockquotebinding">;

</port>;

</service>;

</definitions>;

它包含了以下的關鍵資訊:

訊息的描述和格式定義可以通過xml文件中的<types>;和<message>; 標記來傳送。

<porttype>; 標記中表示了訊息傳送機制。 (e.g. request-only, request-response, response-only) 。

<binding>; 標記指定了編碼的規範 。

<service>; 標記中表示服務所處的位置 (url)。

wsdl在uddi中總是作為一個介面描述文件。因為uddi是一個通用的用來註冊wsdl規範的地方,uddi的規範並不限制任何型別或者格式描述文件。這些文件可能是一個wsdl文件,或者是一個正規的包含導向文件的web頁面,也可能只是一個包含聯絡資訊的電子郵件地址。

現在java提供了一個 java api for wsdl (jwsdl)規範。它提供了一套能快速處理wsdl文件的方法,並且不用直接對xml文件進行操作,它會比jaxp更方便,更快速。

soap

當商業使用者通過uddi找到你的wsdl描述文件後,他通過可以simple object access protocol (soap) 呼叫你建立的web服務中的一個或多個操作。

soap是xml文件形式的呼叫商業方法的規範,它可以支援不同的底層介面,象http(s)或者smtp。

之所以使用xml是因為它的獨立於程式語言,良好的可擴充套件性以及強大的工業支援。之所以使用http是因為幾乎所有的網路系統都可以用這種協議來通訊,由於它是一種簡單協議,所以可以與任何系統結合,還有一個原因就是它可以利用80埠來穿越過防火牆。

soap的強大是因為它簡單。soap是一種輕量級的,非常容易理解的技術,並且很容易實現。它有工業支援,可以從各主要的電子商務平臺供應商那裡獲得。

從技術角度來看,soap詳細指明瞭如何響應不同的請求以及如何對引數編碼。一個soap封裝了可選的頭資訊和正文,並且通常使用http post方法來傳送到一個http 伺服器,當然其他方法也是可以的,例如smtp。soap同時支援訊息傳送和遠端過程呼叫。以下是一個soap請求。

post /stockquote http/1.1

host:

content-type: text/xml; charset="utf-8"

content-length: nnnn

soapaction: "some-uri"

<soap-env:envelope

<soap-env:header>;

<t:transaction xmlns:t="some-uri" soap-env:mustunderstand="1">;

5

</t:transaction>;

</soap-env:header>;

<soap-env:body>;

<m:getlasttradeprice xmlns:m="some-uri">;

<symbol>;sunw</symbol>;

</m:getlasttradeprice>;

</soap-env:body>;

</soap-env:envelope>;

jaxr

為了支援uddi在java平臺上的功能,java apis for xml registries (jaxr)允許開發者來訪問註冊中心。

值得注意的是,jaxr並不是建立web服務必需的,你可以利用其他常用的xml apis來直接整合這些協議。

jaxr是一個方便的api,它提供了java api來發布,查詢以及編輯那些註冊資訊。它的重點在於基於xml的b2b應用,複雜的地址本查詢以及對xml訊息訂閱的支援等web服務。

它也可以用來訪問其他型別的註冊中心,象ebxml註冊中心。

這些對web服務的註冊資訊進行的操作,可以使用當前的一些web服務工具來完成(例如第三方的soap和ebxml訊息工具)。另外,當jaxp提供了一致並具有針對性的api來完成這些操作,這將使開發變得更加容易。

jax/rpc

為了使開發人員專注於建立象soap那樣的基於xml的請求,jcp正在開發基於rpc (jax/rpc) 的java api。jax/rpc是用來發送和接收方法呼叫請求的,它基於xml協議,象soap,或者其他的象xmlp (xml protocol,要了解更多可以參考。jax/rpc使你不用再關注這些協議的規範,使應用的開發更快速。不久,開發人員就不用直接以xml表示方法呼叫了。

目前有很多第三方實現了soap,開發人員可以在不同的層次上呼叫soap,並選擇使用哪一種。將來,jax/rpc會取代這些apis並提供一個統一的介面來構造以及處理soap rpc請求。

在接收一個從商業夥伴那裡過來的soap請求的時候,一個java servlet用jax/rpc來接收這個基於xml的請求。一旦接收到請求後,servlet會呼叫商務方法,並且把結果回覆給商業夥伴。

jaxm

當從商業合作伙伴那裡接收一個web服務的請求時,我們需要java api實現一個servlet來處理ebxml訊息,就象我們用jax/rpc來處理soap請求一樣。

java api for xml messaging (jaxm) 是整合xml訊息標準(象ebxml訊息或者soap訊息)的規範。

這個api是用來推動xml訊息處理的,它檢測那些預定單的訊息格式以及約束。它控制了所有的訊息封裝機制,用一種直觀的方式分割了訊息中的資訊,象路由資訊,發貨單。這樣,開發人員只要關注訊息的有效負載,而不用去擔心那些訊息的重複處理。

目前的開發人員用jaxp來實現jaxm將要提供的功能,jaxm將會提供一套非常具有針對性的api來處理基於xml的訊息傳送。這將大大簡化開發人員的程式碼,並使它們具有統一的介面。

jaxm和jax/rpc的差別在於處理訊息導向的中介軟體以及遠端過程呼叫的不同。jaxm注重於訊息導向,而jax/rpc是用來完成遠端過程呼叫的。以下是圖解。

請注意,在jaxm 和 jax/rpc技術成熟之前,開發人員還是依賴於第三方的soap apis,象apache soap, idooxoap, 以及 glue。當jaxm 和 jax/rpc正式釋出後,它將為當前不同的soap和ebxml訊息提供統一的介面。就象jdbc位多種不同的資料庫提供統一的介面。

jaxb

xml繫結技術可以把xml文件和java物件進行自由轉換。

用jaxb,你可以在後臺的ejb層,把xml文件轉換成java物件。同樣你也可以把從ejb中取出的java物件轉換成xml文件返回給使用者。

jaxb介面提供了比sax和dom更高階的方法來處理xml文件。它提供的特性可以在xml資料和java類之間互相對映,提供了一個簡單的方法來轉換xml資料。它比逐個解析標記更簡單。

2.2 建立weservice的步驟

在建立weservice的時候,有三個主要步驟:

1.建立客戶端聯接

為了允許applets,applications,商業合作伙伴,瀏覽器和pdas 使用web服務。

2.實現web服務

包括工作流,資料傳送,商業邏輯以及資料訪問。這些功能是隱藏在web服務後,並且為客戶端工作的。

3.聯接後臺系統

這個系統可能包括一個或多個數據庫,現存的企業資訊系統,商業合作伙伴自己的系統或者web服務,以及在多個系統中共享的資料。

基於j2ee的web服務的核心構架:

rmi

1. rmi-iiop

2. rmi 是在java中使用remote method invocation的最初的方法,rmi使用包

rmi-iiop 是rmi的一個特殊版本,rmi-iiop可以和corba相容,rmi-iiop使用包和

jaf(java活動構架)

開發者可以使用jaf來決定任意一塊資料的型別、封裝對資料的訪問、尋找合適的操作、例項化相關的bean來執行這些操作等。

例如,javamail就是使用jaf根據mime型別來決定例項化那一個物件。

ejb

1. ejb元件實現程式碼的限制

ejb元件的約束

ejb的開發者並不需要在ejb的元件實現程式碼中編寫系統級的服務,ejb提供商/開發

者需知道並且嚴格地遵守一些限制,這些限制與開發穩定的和可移植的ejb元件的利益有

關。

以下是你應該回避使用的一些java特色,並且在你的ejb元件的實現程式碼中要嚴格限

制它們的使用:

1.使用static,非final 欄位。建議你在ejb元件中把所有的static欄位都宣告為final型的。這樣可以保證前後一致的執行期語義,使得ejb容器有可以在多個java虛擬機器之間分發元件例項的靈活性。

2.使用執行緒同步原語來同步多個元件例項的執行。避免這個問題,你就可以使ejb容器靈活的在多個java虛擬機器之間分發元件例項。

3.使用awt函式完成鍵盤的輸入和顯示輸出。約束它的原因是伺服器方的商業元件意味著提供商業功能而不包括使用者介面和鍵盤的i/o功能。

4.使用檔案訪問/ 操作。ejb商業元件意味著使用資源管理器如jdbc來儲存和檢索資料而不是使用檔案系統api。同時,部署工具提供了在部署描述器(descriptor)中儲存環境實體,以至於ejb元件可以通過環境命名上下文用一種標準的方法進行環境實體查詢。所以,使用檔案系統的需求基本上是被排除了。

5.監聽和接收socket連線,或者用socket進行多路傳送。ejb元件並不意味著提供網路socket伺服器功能,但是,這個體系結構使得ejb元件可以作為socket客戶或是rmi客戶並且可以和容器所管理的環境外面的程式碼進行通訊。

6.使用映象api查詢ejb元件由於安全規則所不能訪問的類。這個約束加強了java平臺的安全性。

7.欲建立或獲得一個類的載入器,設定或建立一個新的安全管理器,停止java虛擬機器,改變輸入、輸出和出錯流。這個約束加強了安全性同時保留了ejb容器管理執行環境的能力。

8.設定socket工廠被url's serversocket,socket和stream handler使用。避免這個特點,可以加強安全性同時保留了ejb容器管理執行環境的能力。

9.使用任何方法啟動、停止和管理執行緒。這個約束消除了與ejb容器管理死鎖、執行緒

和併發問題的責任相沖突的可能性。

通過限制使用10-16幾個特點,你的目標是堵上一個潛在的安全漏洞:

10.直接讀寫檔案描述符。

11.為一段特定的程式碼獲得安全策略資訊。

12.載入原始的類庫。

13.訪問java一般角色所不能訪問的包和類。

14.在包中定義一個類。

15.訪問或修改安全配置物件(策略、安全、提供者、簽名者和實體)。

16.使用java序列化特點中的細分類和物件替代。

17.傳遞this引用指標作為一個引數或者作為返回值返回this引用指標。你必須使用

sessioncontext或entitycontext中的getejbobject()的結果。

java2平臺的安全策略

以上所列的特點事實上正是java程式語言和java2標準版中的標準的、強有力的特色。ejb容器允許從j2se中使用一些或全部的受限制的特色,儘管對於ejb元件是不可用的,但需通過j2se的安全機制來使用而不是通過直接使用j2se的api。

java2平臺為ejb1.1規範中的ejb容器所制定的安全策略定義了安全許可集,這些許可在ejb元件的程式設計限制中出現。通過這個策略,定義了一些許可諸如:permission,ermission,ectpermission,ritypermission,以便加強先前所列出的程式設計限制。

許多ejb容器沒有加強這些限制,他們希望ejb元件開發者能遵守這些程式設計限制或者是帶有冒險想法違背了這些限制。違背這些限制的ejb元件,比標準方法依賴過多或過少的安全許可,都將很少能在多個ejb容器間移植。另外,程式碼中都將隱藏著一些不確定的、難以預測的問題。所有這些都足以使ejb元件開發者應該知道這些程式設計限制,同時也應該認真地遵守它們。

任何違背了這些程式設計限制的ejb元件的實現程式碼在編譯時都不能檢查出來,因為這些特點都是java語言和j2se中不可缺少的部分。

對於ejb元件的這些限制同樣適用於ejb元件所使用的幫助/訪問(helper/access)類,j2ee應用程式使用java文件(jar)檔案格式打包到一個帶(代表enterprise archive)副檔名的檔案中,這個ear檔案對於傳送給檔案部署器來說是標準的格式。ear檔案中包括在一個或多個ejb-jar檔案中的ejb元件,還可能有ejb-jar所依賴的庫檔案。所有ear檔案中的程式碼都是經過深思熟慮開發的應用程式並且都遵守程式設計限制和訪問許可集。

未來版本的規範可能會指定通過部署工具來定製安全許可的能力,通過這種方法指定了一個合法的元件應授予的許可許可權,也指定了一個標準方法的需求:如從檔案系統中讀檔案應有哪些要求。一些ejb容器/伺服器目前在它們的部署工具中都提供了比標準許可權或多或少的許可許可權,這些並不是ejb1.1規範中所需要的。

理解這些約束

ejb容器是ejb元件生存和執行的執行期環境,ejb容器為ejb元件例項提供了一些服務如:事務管理、安全持久化、資源訪問、客戶端連線。ejb容器也負責ejb元件例項整個生命期的管理、擴充套件問題以及併發處理。所以,ejb元件就這樣寄居在一個被管理的執行環境中--即ejb容器。

因為ejb容器完全負責ejb元件的生命期、併發處理、資源訪問、安全等等,所以與容器本身的鎖定和併發管理相沖突的可能性就需要消除,許多限制都需要使用來填上潛在的安全漏洞。除了與ejb容器責任與安全衝突的問題,ejb元件還意味著僅僅聚焦於商務邏輯,它依賴於ejb容器所提供的服務而不是自己來直接解決底層的系統層的問題。

可能的問題

通常,ejb元件在容器之間的移植不可避免地與如下問題相關:

1.它需要依靠的受限制的特點在特定ejb容器中沒有得到加強。

2.它需要依靠的非標準的服務從容器中可獲得。

為了保證ejb元件的可移植性和一致的行為,你應該使用一個具有與java2平臺安全

策略集相一致的策略集的容器來測試ejb元件,並且其加強了前述的程式設計限制。

總結

ejb元件開發者應該知道這些推薦的關於ejb元件的程式設計限制,明白它們的重要性,並且從元件的穩定性和可移植性利益方面考慮來遵循它們。因為這些程式設計限制能阻止你使用標準的java語言的特點,違背了這些程式設計限制在編譯時不會知道,並且加強這些限制也不是ejb容器的責任。所有這些原因都使你應很小心地遵守這些程式設計限制,這些限制在元件的合同中已經成為了一個條款,並且它們對於建造可靠的、可移植的元件是非常重要的。

2. 優化ejb

entity bean為在應用程式和設計中描述持久化商業物件(persistent business objec ts)提供了一個清晰的模型。在java物件模型中,簡單物件通常都是以一種簡單的方式進行處理但是,很多商業物件所需要的事務化的永續性管理沒有得到實現。entity bean將持久化機制封裝在容器提供的服務裡,並且隱藏了所有的複雜性。entity bean允許應用程式操縱他們就像處理一個一般的java物件應用。除了從呼叫程式碼中隱藏持久化的形式和機制外,entity bean還允許ejb容器對物件的持久化進行優化,保證資料儲存具有開放性,靈活性,以及可部署性。在一些基於ejb技術的專案中,廣泛的使用oo技術導致了對entity bean的大量使用,sun的工程師們已經積累了很多使用entity bean的經驗,這篇文章就詳細闡述的這些卡發經驗:

*探索各種優化方法

*提供效能優化和提高適用性的法則和建議

*討論如何避免一些教訓。

法則1:只要可以,儘量使用cmp

cmp方式不僅減少了編碼的工作量,而且在container中以及container產生的資料庫訪問程式碼中包括了許多優化的可能。container可以訪問記憶體緩衝中的bean,這就允許它可以監視緩衝中的任何變化。這樣的話就在事物沒有提交之前,如果快取的資料沒有變化就不用寫到資料庫中。就可以避免許多不必要的資料庫寫操作。另外一個優化是在呼叫find方法的時候。通常情況下find方法需要進行以下資料庫操作:

查詢資料庫中的紀錄並且獲得主鍵

將紀錄資料裝入快取

cmp允許將這兩步操作優化為一步就可以搞定。[具體怎麼做我也沒弄明白,原文沒有具體闡述]

法則2:寫程式碼時儘量保證對bmp和cmp都支援

許多情況下,ejb的開發者可能無法控制他們寫的bean怎麼樣被部署,以及使用的container是不是支援cmp.

一個有效的解決方案是,將商業邏輯的編碼完全和持久化機制分離。再cmp類中實現商業邏輯,然後再編寫一個bmp類,用該類繼承cmp類。這樣的話,所有的商業邏輯都在cmp類中,而持久化機制在bmp中實現。[我覺得這種情況在實際工作中很少遇到,但是作者解決問題的思路值得學習]

法則3:把ejbstore中的資料庫訪問減小到最少。

如果使用bmp,設定一個快取資料改變標誌dirty非常有用。所有改變資料庫中底層資料的操作,都要設定dirty,而在ejbstore()中,首先檢測dirty的值,如果dirty的值沒有改變,表明目前資料庫中的資料與快取的一致,就不必進行資料庫操作了,反之,就要把快取資料寫入資料庫。

法則4:總是將從lookup和find中獲得的引用進行快取。(cache)

引用快取對session bean和entity bean 都是適用的。

通過jndi lookup獲得ejb資源。比如datasource,bean的引用等等都要付出相當大的代價。因此應該避免多餘的lookup.可以這樣做:

將這些引用定義為例項變數。

從setentitycontext(session bean使用setsessioncontext)方法查詢他們。setentitycontext方法對於一個bean例項只執行一次,所有的相關引用都在這一次中進行查詢,這樣查詢的代價就不是那麼昂貴了。應該避免在其他方法中查詢引用。尤其是訪問資料庫的方法:ejbload()和ejbstore(),如果在這些頻繁呼叫的方法中進行datasource的查詢,勢必造成時間的浪費。

呼叫其他entity bean的finder方法也是一種重量級的呼叫。多次呼叫finder()方法的代價非常高。如果這種引用不適合放在setentitycontext這樣的初始化時執行的方法中執行,就應該在適當的時候快取finder的執行結果。只是要注意的是,如果這個引用只對當前的entity有效,你就需要在bean從緩衝池中取出來代表另外一個實體時清除掉這些引用。,這些操作應該在ejbactivate()中進行。

法則5:總是使用prepare statements

這條優化法則適用於所有訪問關係資料庫的操作。

資料庫在處理每一個sql statement的時候,執行前都要對statement進行編譯。一些資料庫具有快取statement和statement的編譯後形式的功能。資料庫可以把新的statement和快取中的進行匹配。然而,如果要使用這一優化特性,新的statement要必須和快取中的statement完全匹配。

對於non-prepared statement,資料和statement本身作為一個字串傳遞,這樣由於前後呼叫的資料不同而不能匹配,就導致無法使用這種優化。而對於prepared statement,資料和statement是分開傳遞給資料庫的,這樣statement就可以和cache中已編譯的statement進行匹配。statement就不必每次都進行編譯操作。從而使用該優化屬性。

這項技術在一些小型的資料庫訪問中能夠減少statement將近90%的執行時間。

法則6:完全關閉所有的statement

在編寫bmp的資料庫訪問程式碼時,記住一定要在資料庫訪問呼叫之後關閉statement,因為每個開啟的statement對應於資料庫中的一個開啟的遊標。

security

1.加密

對稱加密

(1)分組密碼

(2)流密碼

常用的對稱加密演算法:

des和tripledes

blowfish

rc4

aes

非對稱加密

常用的非對稱加密演算法

rsa

elgamal

會話金鑰加密(對稱加密和非對稱加密一起使用)

常用的會話金鑰加密協議

s/mime

pgp

ssl和tls ssl是在application level protocal和transport protocal之間的。

比如:http和tcp/ip之間

ssl 提供了伺服器端認證和可選的客戶端認證,保密性和資料完整性。

提供基於ssl方式的傳輸加密和認證,確保以下三種安全防護:

資料的機密性和準確性、

伺服器端認證

客戶端認證。

客戶端認證比伺服器端認證不很普遍的原因是每一個要被認證的客戶都必須有一張verisign這樣的ca簽發的證書。

通常,在進行身份認證的時候,應當只接受一個ca,這個ca的名字包含在客戶證書中。

由於不可能隨意建立一個由指定ca簽發的證書,所以這可以有效的防禦通過偽造證書來進行的攻擊嘗試。

2.認證(authentication)

認證就是確定一條訊息或一個使用者的可靠性的過程。

1.訊息摘要

md5

sha和sha-1

2.訊息認證碼(message authientication codes,mac)

3.數字簽名

使用者可以用自己的金鑰對資訊加以處理,由於金鑰僅為本人所有,這樣就產生了別人無法生成的檔案,也就形成了數字簽名

數字簽名可以

1)保證資料的完整性

2)驗證使用者的身份

數字簽名採用一個人的私鑰計算出來,然後用公鑰去檢驗。

hash演算法 私鑰加密

原報文 ――――――>;報文摘要( message digest ) ―――――>;數字簽名

原報文和數字簽名一起被髮送到接受者那裡,接受者用同樣的hash演算法得到報文摘要,然後用傳送者的公鑰解開數字簽名。

比較是否相同,則可以確定報文確定來自發送者。

驗證數字簽名必須使用公鑰,但是,除非你是通過安全的方式直接得到,否則不能保證公鑰的正確性。(數字證書可以解決這個問題)

一個接受者在使用公鑰(public key)檢查數字簽名(digital signature)的可信度時,通常先要檢查收到的公鑰(public key)是否可信的。

因此傳送方不是單單地傳送公鑰(public key),而是傳送一個包含公鑰(public key)的數字證書(cetificate )。

4.數字證書

數字證書是一個經證書授權中心數字簽名的包含公開金鑰所有者資訊以及公開金鑰的檔案。

數字證書cetificate中包括:

i. 使用者的公鑰(public key)

ii. 使用者的一些資訊,如姓名,email

iii. 發行機構的數字簽名(digital signature), 用於保證證書的可信度

iv. 發行機構的一些資訊

數字證書的格式遵循x.509國際標準。

注意:一個數字證書certificate並不適用於多種browser,甚至一種browser的多個版本。

數字標識由公用金鑰、私人金鑰和數字簽名三部分組成。

當在郵件中新增數字簽名時,您就把數字簽名和公用金鑰加入到郵件中。數字簽名和公用金鑰統稱為證書。您可以使用 outlook express 來指定他人向您傳送加密郵件時所需使用的證書。這個證書可以不同於您的簽名證書。

收件人可以使用您的數字簽名來驗證您的身份,並可使用公用金鑰給您傳送加密郵件,這些郵件必須用您的私人金鑰才能閱讀。

要傳送加密郵件,您的通訊簿必須包含收件人的數字標識。這樣,您就可以使用他們的公用金鑰來加密郵件了。當收件人收到加密郵件後,用他們的私人金鑰來對郵件進行解密才能閱讀。

在能夠傳送帶有數字簽名的郵件之前,您必須獲得數字標識。如果您正在傳送加密郵件,您的通訊簿中必須包含每位收件人的數字標識。

數字證書,可以是個人證書或 web 站點證書,用於將身份與"公開金鑰"關聯。只有證書的所有者才知道允許所有者"解密"或進行"數字簽名"的相應"私人金鑰"。當您將自己的證書傳送給其他人時,實際上發給他們的是您的公開金鑰,這樣他們就可以向您傳送只能由您使用私人金鑰解密和讀取的加密資訊。 

通過瀏覽器使用數字證書,必須先要設定瀏覽器軟體 internet explorer 或 netscape使用此證書,才能開始傳送加密或需要數字簽名的資訊。訪問安全的 web 站點(以"https"打頭的站點)時,該站點將自動向您傳送他們的web站點證書。

3.ca(證書授證中心)

ca機構,又稱為證書授證(certificate authority)中心,作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。ca中心為每個使用公開金鑰的使用者發放一個數字證書,數字證書的作用是證明證書中列出的使用者合法擁有證書中列出的公開金鑰。ca機構的數字簽名使得攻擊者不能偽造和篡改證書。在set交易中,ca不僅對持卡人、商戶發放證書,還要對獲款的銀行、閘道器發放證書。它負責產生、分配並管理所有參與網上交易的個體所需的數字證書,因此是安全電子交易的核心環節。

對證書的信任基於對根證書的信任. 例如在申請sheca的個人數字證書前,需要先下載根證書,然後再進行各類證書的申請。

下載根證書的目的:

網路伺服器驗證(s);安全電子郵件(e)

申請個人數字證書可以為internet使用者提供傳送電子郵件的安全和訪問需要安全連線(需要客戶證書)的站點。

1)個人數字證書

a.個人身份證書

個人身份證書是用來表明和驗證個人在網路上的身份的證書,它確保了網上交易和作業的安全性和可靠性。可應用於:網上炒股、網上理財、網上保險、網上繳費、網上購物、網上辦公等等。個人身份證書可以儲存在軟盤或ic卡中。  

b.個人安全電子郵件證書

個人安全電子郵件證書可以確保郵件的真實性和保密性。申請後一般是安裝在使用者的瀏覽器裡。使用者可以利用它來發送簽名或加密的電子郵件。

使用者在申請安裝完安全安全電子郵件數字證書後,就可以對要傳送的郵件進行數字簽名。收信人收到該郵件後,就可以看到數字簽名的標記,這樣就可以證明郵件肯定來自發信者本人,而不是別人盜用該帳號偽造信件,同時也保證該郵件在傳送過程中沒被他人篡改過任何資料。

安全電子郵件中使用的數字證書可以實現:

保密性 通過使用收件人的數字證書對電子郵件加密。如此以來,只有收件人才能閱讀加密的郵件,在internet上傳遞的電子郵件資訊不會被人竊取,即使發錯郵件,收件人也無法看到郵件內容。

認證身份 在internet上傳遞電子郵件的雙方互相不能見面,所以必須有方法確定對方的身份。利用發件人數字證書在傳送前對電子郵件進行數字簽名即可確定發件人身份,而不是他人冒充的。

完整性 利用發件人數字證書在傳送前對電子郵件進行數字簽名不僅可確定發件人身份,而且傳遞的電子郵件資訊也不能被人在傳輸過程中修改。

不可否認性 由於發件人的數字證書只有發件人唯一擁有,故發件人利用其數字證書在傳送前對電子郵件進行數字簽名,發件人就無法否認發過這個電子郵件。

outlook express中的個人安全電子郵件證書

簽名郵件帶有簽名郵件圖示。

簽名郵件可能出現的任何問題都將在本資訊之後可能出現的“安全警告”中得到描述。如果存在問題,您應該認為郵件已被篡改,或並非來自所謂的發件人。

當收到一封加密郵件時,您應該可以自信地認為郵件未被任何第三者讀過。outlook express 會自動對電子郵件解密, 如果在您的計算機上裝有正確的數字標識。

2)企業數字證書

a.企業身份證書

企業身份證書是用來表明和驗證企業使用者在網路上身份的證書,它確保了企業網上交易和作業的安全性和可靠性。可應用於:網上證券、網上辦公、網上交稅、網上採購、網上資金轉帳、網上銀行等。企業身份證書可以儲存在軟盤和ic卡中。

b.企業安全電子郵件證書

企業安全電子郵件證書可以確保郵件的真實性和保密性。申請後一般是安裝在使用者的瀏覽器裡。企業可以利用它來發送簽名或加密的電子郵件。

可使用 windows xx 中的證書服務來建立證書頒發機構 (ca),它負責接收證書申請、驗證申請中的資訊和申請者的身份、頒發證書、吊銷證書以及釋出證書吊銷列表 (crl)。

通常,當用戶發出證書申請時,在其計算機上的加密服務提供程式 (csp) 為使用者生成公鑰和私鑰對。使用者的公鑰隨同必要的識別資訊傳送至 ca。如果使用者的識別資訊符合批准申請的 ca 標準,那麼 ca 將生成證書,該證書由客戶應用程式檢索並就地儲存。

4.set

安全介面層協議——ssl(se cure socketslayer),並且已經幾乎成為了目前www 世界的事實標準。這一標準使用公共金鑰編碼方案來對傳輸資料進行加密,在雙方之間建立一個internet 上的加密通道,從而使第三方無法獲得其中的資訊,其思路與目前流行的vpn方案大致相同,目的都是要保護資料不被未經授權的第三方所竊聽,或即使竊聽到也不知所云。但就象vpn 一樣,ssl 在認證方面沒有任何作為,它們都需要通過另外的手段來確認身份和建立雙方彼此間的信任,然後再通過ssl 進行交易。

正是由於ssl 標準在認證方面的缺憾,所以set 才有存在的必要。set(secure electronic transactions) 規範由masterc ard 和visa 公司於1996 年釋出,專家們認為set 是保證使用者與商家在電子商務與線上交易中免受欺騙的重要手段。傳統的信用卡交易者總在擔心不誠實的店員會將自己的信用卡號碼透露給他人,而線上交易也是如此,持卡者總在擔心伺服器端的管理員會將信用卡號碼洩露出去,或者擔心黑客會在管理員不知情的情況下盜取信用卡號碼。事實上這些擔心都是必要的,而set 標準則可以保證使用者的信用卡號碼只傳送給信用卡公司進行認證,不會被系統管理員看到,也不會留在交易伺服器的硬碟上給黑客以可乘之機。

5.pki

pki是一種易於管理的、集中化的網路安全方案。它可支援多種形式的數字認證: 資料加密、數字簽字、不可否認、身份鑑別、金鑰管理以及交叉認證等。pki可通過一個基於認證的框架處理所有的資料加密和數字簽字工作。p ki標準與協議的開發迄今已有15年的歷史,目前的pki已完全可以向企業網路提供有效的安全保障。

pki是一種遵循標準的金鑰管理平臺,它能夠為所有網路應用透明地提供採用加密和數字簽名等密碼服務所必需的金鑰和證書管理。pki必須具有

1)ca、

2)證書庫、

3)金鑰備份及恢復系統、

4)證書作廢處理系統、

5)客戶端證書處理系統

等基本成分,構建pki也將圍繞著這五大系統來構建

一個pki由眾多部件組成,這些部件共同完成兩個主要功能:

1)為資料加密

2)建立數字認證。

伺服器(即後端)產品是這一系統的核心,這些資料庫管理著數字認證、公共金鑰及專用金鑰( 分別用於資料的加密和解密)。

ca資料庫負責釋出、廢除和修改x.509數字認證資訊,它裝有使用者的公共金鑰、證書有效期以及認證功能(例如對資料的加密或對數字簽字的驗證) 。為了防止對資料簽字的篡改,ca在把每一數字簽字傳送給發出請求的客戶機之前,需對每一個數字簽字進行認證。一旦數字認證得以建立, 它將會被自動儲存於x.500目錄中,x.500目錄為樹形結構。ldap(lightweight directory access protocol)協議將響應那些要求提交所儲存的公共金鑰認證的請求。ca為每一使用者或伺服器生成兩對獨立的公共和專用金鑰。其中一對用於資訊的加密和解密, 另一對由客戶機應用程式使用,用於文件或資訊傳輸中數字簽字的建立。

大多數pki均支援證書分佈,這是一個把已釋出過的或續延生命期的證書加以儲存的過程。這一過程使用了一個公共查詢機制,x.500目錄可自動完成這一儲存過程。影響企業普遍接受p ki的一大障礙是不同ca之間的交叉認證。假設有兩家公司,每一家企業分別使用來自不同供應商的ca,現在它們希望相互託管一段時間。如果其後援資料庫支援交叉認證, 則這兩家企業顯然可以互相托管它們的ca,因而它們所託管的所有使用者均可由兩家企業的ca所託管。

* 認證機關

ca是證書的簽發機構,它是pki的核心。眾所周知,構建密碼服務系統的核心內容是如何實現金鑰管理,公鑰體制涉及到一對金鑰,即私鑰和公鑰, 私鑰只由持有者祕密掌握,無須在網上傳送,而公鑰是公開的,需要在網上傳送,故公鑰體制的金鑰管理主要是公鑰的管理問題,目前較好的解決方案是引進證書(certificate)機制。

證書是公開金鑰體制的一種金鑰管理媒介。它是一種權威性的電子文件,形同網路計算環境中的一種身份證,用於證明某一主體(如人、伺服器等)的身份以及其公開金鑰的合法性。在使用公鑰體制的網路環境中, 必須向公鑰的使用者證明公鑰的真實合法性。因此,在公鑰體制環境中,必須有一個可信的機構來對任何一個主體的公鑰進行公證,證明主體的身份以及他與公鑰的匹配關係。c a正是這樣的機構,它的職責歸納起來有:

1、驗證並標識證書申請者的身份;

2、確保ca用於簽名證書的非對稱金鑰的質量;

3、確保整個簽證過程的安全性,確保簽名私鑰的安全性;

4、證書材料資訊(包括公鑰證書序列號、ca標識等)的管理;

5、確定並檢查證書的有效期限;

6、確保證書主體標識的唯一性,防止重名;

7、釋出並維護作廢證書表;

8、對整個證書籤發過程做日誌記錄;

9、向申請人發通知。

其中最為重要的是ca自己的一對金鑰的管理,它必須確保其高度的機密性,防止他方偽造證書。ca的公鑰在網上公開,整個網路系統必須保證完整性。

* 證書庫

證書庫是證書的集中存放地,它與網上"白頁”類似,是網上的一種公共資訊庫,使用者可以從此處獲得其他使用者的證書和公鑰。

構造證書庫的最佳方法是採用支援ldap協議的目錄系統,使用者或相關的應用通過ldap來訪問證書庫。系統必須確保證書庫的完整性,防止偽造、篡改證書。

* 金鑰備份及恢復系統

* 證書作廢處理系統

* pki應用介面系統

pki的價值在於使使用者能夠方便地使用加密、數字簽名等安全服務,因此一個完整的pki必須提供良好的應用介面系統,使得各種各樣的應用能夠以安全、一致、可信的方式與p ki互動,確保所建立起來的網路環境的可信性,同時降低管理維護成本。最後,pki應用介面系統應該是跨平臺的。

許多權威的認證方案供應商(例如verisign、thawte以及gte)目前都在提供外包的pki。外包pki最大的問題是,使用者必須把企業託管給某一服務提供商, 即讓出對網路安全的控制權。如果不願這樣做,則可建造一個專用的pki。專用方案通常需把來自entrust、baltimore technologies以及xcert的多種伺服器產品與來自主流應用程式供應商(如microsoft、netscape以及qualcomm)的產品組合在一起。專用pk i還要求企業在準備其基礎設施的過程中投入大量的財力與物力。

7.jaas

擴充套件jaas實現類例項級授權

“java 認證和授權服務”(java authentication and authorization service,jaas)

在 jaas 下,可以給予使用者或服務特定的許可權來執行 java 類中的程式碼。在本文中,軟體工程師 carlos fonseca 向您展示如何為企業擴充套件 jaas 框架。向 jaas 框架新增類例項級授權和特定關係使您能夠構建更動態、更靈活並且伸縮性更好的企業應用程式。

大多數 java 應用程式都需要某種類例項級的訪問控制。例如,基於 web 的、自我服務的拍賣應用程式的規範可能有下列要求:

任何已註冊(經過認證)的使用者都可以建立一個拍賣,但只有建立拍賣的使用者才可以修改這個拍賣。

這意味著任何使用者都可以執行被編寫用來建立 auction 類例項的程式碼,但只有擁有該例項的使用者可以執行用來修改它的程式碼。通常情況下,建立 auction 例項的使用者就是所有者。這被稱為類例項所有者關係(class instance owner relationship)。

該應用程式的另一個要求可能是:

任何使用者都可以為拍賣建立一個投標,拍賣的所有者可以接受或拒絕任何投標。

再一次,任何使用者都可以執行被編寫用來建立 bid 類例項的程式碼,但只有擁有該例項的使用者會被授予修改該例項的許可權。而且,auction 類例項的所有者必須能夠修改相關的 bid 類例項中的接受標誌。這意味著在 auction 例項和相應的 bid 例項之間有一種被稱為特定關係(special relationship)的關係。

不幸的是,“java 認證和授權服務”(jaas)— 它是 java 2 平臺的一部分 — 沒有考慮到類例項級訪問控制或者特定關係。在本文中,我們將擴充套件 jaas 框架使其同時包含這兩者。推動這種擴充套件的動力是允許我們將訪問控制分離到一個通用的框架,該框架使用基於所有權和特定關係的策略。然後管理員可以在應用程式的生命週期內更改這些策略。

在深入到擴充套件 jaas 框架之前,我們將重溫一下 java 2 平臺的訪問控制機制。我們將討論策略檔案和許可權的使用,並討論 securitymanager 和 accesscontroller 之間的關係。

java 2 平臺中的訪問控制

在 java 2 平臺中,所有的程式碼,不管它是原生代碼還是遠端程式碼,都可以由策略來控制。策略(policy)由不同位置上的程式碼的一組許可權定義,或者由不同的簽發者定義、或者由這兩者定義。許可權允許對資源進行訪問;它通過名稱來定義,並且可能與某些操作關聯在一起。

抽象類 cy 被用於表示應用程式的安全性策略。預設的實現由 cyfile 提供,在 cyfile 中,策略被定義在一個檔案中。清單 1 是一個典型策略檔案示例:

清單 1. 一個典型的策略檔案

// grant these permissions to code loaded from a file

// in the c drive and if it is signed by xyz

grant codebase "file:/c:/", signedby "xyz" {

// allow socket actions to any host using port 8080

permission etpermission "*:8080", "accept, connect,

listen, resolve";

// allows file access (read, write, execute, delete) in

// the user's home directory.

permission permission "${}/-", "read, write,

execute, delete";

};

securitymanager 對 accesscontroller

在標準 jdk 分發版中,控制程式碼源訪問的機制預設情況下是關閉的。在 java 2 平臺以前,對程式碼源的訪問都是由 securitymanager 類管理的。securitymanager 是由 ger 系統屬性啟動的,如下所示:

java ger

在 java 2 平臺中,可以將一個應用程式設定為使用 ritymanager 類或者 sscontroller 類管理敏感的操作。accesscontroller 在 java 2 平臺中是新出現的。為便於向後相容,securitymanager 類仍然存在,但把自己的決定提交 accesscontroller 類裁決。securitymanager 和 accesscontroller 都使用應用程式的策略檔案確定是否允許一個被請求的操作。清單 2 顯示了 accesscontroller 如何處理 socketpermission 請求:

清單 2. 保護敏感操作

public void somemethod() {

permission permission =

new etpermission("localhost:8080", "connect");

kpermission(permission);

// sensitive code starts here

socket s = new socket("localhost", 8080);

}

在這個示例中,我們看到 accesscontroller 檢查應用程式的當前策略實現。如果策略檔案中定義的任何許可權暗示了被請求的許可權,該方法將只簡單地返回;否則丟擲一個 accesscontrolexception 異常。在這個示例中,檢查實際上是多餘的,因為預設套接字實現的建構函式也執行相同的檢查。

在下一部分,我們將更仔細地看一下 accesscontroller 如何與 cy 實現共同合作安全地處理應用程式請求。

執行中的 accesscontroller

accesscontroller 類典型的 checkpermission(permission p) 方法呼叫可能會導致下面的一系列操作:

accesscontroller 呼叫 cy 類實現的 getpermissions(codesource codesource) 方法。

getpermissions(codesource codesource) 方法返回一個 permissioncollection 類例項,這個類例項代表一個相同型別許可權的集合。

accesscontroller 呼叫 permissioncollection 類的 implies(permission p) 方法。

接下來,permissioncollection 呼叫集合中包含的單個 permission 物件的 implies(permission p) 方法。如果集合中的當前許可權物件暗示指定的許可權,則這些方法返回 true,否則返回 false。

現在,讓我們更詳細地看一下這個訪問控制序列中的重要元素。

permissioncollection 類

大多數許可權類型別都有一個相應的 permissioncollection 類。這樣一個集合的例項可以通過呼叫 permission 子類實現定義的 newpermissioncollection() 方法來建立。cy 類實現的 getpermissions() 方法也可以返回 permissions 類例項 — permissioncollection 的一個子類。這個類代表由 permissioncollection 組織的不同型別許可權物件的一個集合。permissions 類的 implies(permission p) 方法可以呼叫單個 permissioncollection 類的 implies(permission p) 方法。

codesource 和 protectiondomain 類

許可權組合與 codesource(被用於驗證籤碼(signed code)的程式碼位置和證書)被封裝在 protectiondomain 類中。有相同許可權和相同 codesource 的類例項被放在相同的域中。帶有相同許可權,但不同 codesource 的類被放在不同的域中。一個類只可屬於一個 protectiondomain。要為物件獲取 protectiondomain,請使用 s 類中定義的 getprotectiondomain() 方法。

許可權

賦予 codesource 許可權並不一定意味著允許所暗示的操作。要使操作成功完成,呼叫棧中的每個類必須有必需的許可權。換句話說,如果您將 permission 賦給類 b,而類 b 是由類 a 來呼叫,那麼類 a 必須也有相同的許可權或者暗示 permission 的許可權。

在另一方面,呼叫類可能需要臨時許可權來完成另一個擁有那些許可權的類中的操作。例如,當從另一個位置載入的類訪問本地檔案系統時,我們可能不信任它。但是,本地載入的類被授予對某個目錄的讀許可權。這些類可以實現 privilegedaction 介面來給予呼叫類許可權以便完成指定的操作。呼叫棧的檢查在遇到 privilegedaction 例項時停止,有效地將執行指定操作所必需的許可權授予所有的後繼類呼叫。

使用 jaas

顧名思義,jaas 由兩個主要元件組成:認證和授權。我們主要關注擴充套件 jaas 的授權元件,但開始我們先簡要概述一下 jaas 認證,緊接著看一下一個簡單的 jaas 授權操作。

jaas 中的使用者認證

jaas 通過新增基於 subject 的策略加強了 java 2 中定義的訪問控制安全性模型。許可權的授予不僅基於 codesource,還基於執行程式碼的使用者。顯然,要使這個模型生效,每個使用者都必須經過認證。

jaas 的認證機制建立在一組可插登入模組的基礎上。jaas 分發版包含幾個 loginmodule 實現。loginmodules 可以用於提示使用者輸入使用者標識和密碼。logincontext 類使用一個配置檔案來確定使用哪個 loginmodule 對使用者進行認證。這個配置可以通過系統屬性 ig 指定。一個示例配置是:

java ig=

下面是一個登入配置檔案的樣子:

example {

nmoduleexample required

debug=true userfile="" groupfile="";

};

認識您的主體

subject 類被用於封裝一個被認證實體(比如使用者)的憑證。一個 subject 可能擁有一個被稱為主體(principal)的身份分組。例如,如果 subject 是一個使用者,使用者的名字和相關的社會保險號可能是 subject 的某些身份或主體。主體是與身份名關聯在一起的。

principal 實現類及其名稱都是在 jaas 策略檔案中指定的。預設的 jaas 實現使用的策略檔案與 java 2 實現的策略檔案相似 — 除了每個授權語句必須與至少一個主體關聯在一起。cy 抽象類被用於表示 jaas 安全性策略。它的預設實現由 cyfile 提供,在 cyfile 中策略定義在一個檔案中。清單 3 是 jaas 策略檔案的一個示例:

清單 3. 示例 jaas 策略檔案

// example grant entry

grant codebase "file:/c:/", signedby "xyz",

principal cipalexample "admin" {

// allow socket actions to any host using port 8080

permission etpermission

"*:8080", "accept, connect, listen, resolve";

// allows file access (read, write, execute, delete) in

// the user's home directory.

permission permission

"${}/-", "read, write, execute, delete";

};

這個示例與清單 1 中所示的標準 java 2 策略檔案相似。實際上,唯一的不同是主體語句,該語句宣告只有擁有指定主體和主體名字的 subject(使用者)被授予指定的許可權。

再一次,使用系統屬性 cy 指出 jaas 策略檔案駐留在何處,如下所示:

java cy=

subject 類包含幾個方法來作為特殊 subject 執行工作;這些方法如下所示:

public static object

doas(subject subject, ilegedaction action)

public static object

doas(subject subject, ilegedaction action)

throws ilegedactionexception

注意,用來保護敏感程式碼的方法與“java 2 程式碼源訪問控制”(java 2 codesource access control)概述中描述的方法相同。請參閱參考資料部分以瞭解更多關於 jaas 中程式碼源訪問控制和認證的資訊。

jaas 中的授權

清單 4 顯示一個授權請求的結果,該請求使用清單 3 中顯示的 jaas 策略檔案。假設已經安裝了 securitymanager,並且 logincontext 已經認證了一個帶有名為“admin”的 cipalexample 主體的 subject。

清單 4. 一個簡單的授權請求

public class jaasexample {

public static void main(string[] args) {

...

// where authenticateduser is a subject with

// a principalexample named admin.

(authenticateduser, new jaasexampleaction());

...

}

}

public class jaasexampleaction implements privilegedaction {

public object run() {

filewriter fw = new filewriter("");

e("hello, world!");

e();

}

}

這裡,敏感程式碼被封裝在 jaasexampleaction 類中。還要注意,呼叫類不要求為 jaasexampleaction 類程式碼源授予許可權,因為它實現了一個 privilegedaction。

擴充套件 jaas

大多數應用程式都有定製邏輯,它授權使用者不僅僅在類上執行操作,而且還在該類的例項上執行操作。這種授權通常建立在使用者和例項之間的關係上。這是 jaas 的一個小缺點。然而,幸運的是,這樣設計 jaas 使得 jaas 可以擴充套件。只要做一點工作,我們將可以擴充套件 jaas,使其包含一個通用的、類例項級的授權框架。

在文章開頭處我已經說明了,抽象類 cy 被用於代表 jaas 安全性策略。它的預設實現是由 cyfile 類提供。policyfile 類從 jaas 格式的檔案(象清單 3 中顯示的那個一樣)中讀取策略。

我們需要向這個檔案新增一個東西為類例項級授權擴充套件策略定義:一個與許可權語句相關的可選關係引數。

預設 jaas 許可權語句的格式如下:

permission <permission implementation class>; [name], [actions];

我們在這個許可權語句的末尾新增一個可選的關係引數來完成策略定義。下面是新許可權語句的格式:

permission <permission implementation class>;

[name], [actions], [relationship];

在為類例項級授權擴充套件 jaas 時要注意的最重要的一點是:許可權實現類必須有一個帶三個引數的建構函式。第一個引數是名稱引數,第二個是行為引數,最後一個是關係引數。

解析新檔案格式

既然檔案格式已經改變,就需要一個新的 cy 子類來解析檔案。

為簡單起見,我們的示例使用了一個新的 cy 子類 olicyfile,來從 xml 檔案讀取策略。在實際的企業應用程式中,關係資料庫更適合執行這個任務。

使用 xmlpolicyfile 類代替預設的 jaas 訪問控制策略實現的最容易的方法是向 rity 屬性檔案新增 ider=olicyfile 條目。rity 屬性檔案位於 java 2 平臺執行時的 lib/security 目錄下。清單 5 是與 xmlpolicyfile 類一起使用的樣本 xml 策略檔案:

清單 5. 一個 xml 策略檔案

<?xml version="1.0"?>;

<policy>;

<grant codebase="file:/d:/sample_">;

<principal classname=

"cipalexample" name="users">;

<permission classname=

"urcepermission"

name="ion"

actions="create" />;

<permission classname=

"urcepermission"

name="ion"

actions="read" />;

<permission classname=

"urcepermission"

name="ion"

actions="write"

relationship="owner" />;

<permission classname=

"urcepermission"

name=""

actions="create" />;

<permission classname=

"urcepermission"

name=""

actions="read" />;

<permission classname=

"urcepermission"

name=""

actions="write"

relationship="owner" />;

<permission classname=

"urcepermission"

name=""

actions="accept"

relationship="actionowner" />;

</principal>;

</grant>;

</policy>;

在這個示例策略檔案中,任何與名為 principalexample 的使用者有關的使用者(subject)都可以建立並讀取一個 s 例項。但是,只有建立該例項的使用者才可以更新(寫)它。這是第三個 permission 元素定義的,該元素包含值為 owner 的 relationship 屬性。s 例項也是一樣,除了相應 s 例項的所有者可以更改投標接受標誌。

resource 介面

要求類例項級訪問控制的類必須實現 resource 介面。該介面的 getowner() 方法返回類例項的所有者。fulfills(subject subject, string relationship) 方法被用於處理特定關係。另外,這些類使用 urcepermission 類保護敏感程式碼。例如,auction 類擁有下列建構函式:

public auction() {

permission permission =

new resourcepermission("ion", "create");

kpermission(permission);

}

所有者關係

resourcepermission 類的 implies(permission p) 方法是這個框架的關鍵。implies() 方法就等同性比較名稱和行為屬性。如果定義了一個關係,那麼必須把受保護的類例項(resource)傳遞到 resourcepermission 建構函式中。resourcepermission 類理解所有者關係。它將類例項的所有者與執行程式碼的 subject(使用者)進行比較。特定關係被委託給受保護類的 fulfills() 方法。

例如,在清單 5 中所示的 xml 策略檔案中,只有 auction 類例項的所有者可以更新(寫)檔案。該類的 setter 方法使用清單 6 中顯示的保護程式碼:

清單 6. 執行中的 implies(permission) 方法

public void setname(string newname) {

permission permission =

new resourcepermission("ion", "write", this);

kpermission(permission);

// sensitive code

= newname;

}

被傳遞到 resourcepermission 建構函式中的 this 引用代表 auction 類實現的 resource 介面。由於策略檔案中列出的關係是 owner,所以 resourcepermission 類使用這個引用檢查當前 subject(使用者)是否擁有與例項所有者相匹配的主體。如果指定了另一個關係,那麼 resourcepermission 類呼叫 auction 類的 fulfills(subject subject, string relationship) 方法。由 resource 實現類提供 fulfills() 方法中的邏輯。

xml 策略檔案中列出的 bid 類擁有清單 7 中所示的方法(假設 bid 類例項有一個對相應 auction 類例項的引用 — auction)。

清單 7. 處理特定關係

public void setaccepted(boolean flag) {

permission permission =

new resourcepermission("ion", "accept", this);

kpermission(permission);

// sensitive code

pted = flag;

}

public boolean fulfills(subject user, string relationship) {

if( lsignorecase("auctionowner") ) {

string auctionowner = wner();

iterator principaliterator = rincipals()ator();

while(ext()) {

principal principal = (principal) ();

if( ame()ls(auctionowner) )

return true;

}

}

return false;

}

傳遞到 fulfills() 方法中的關係字串是策略檔案中列出的關係。在這個案例中,我們使用了“auctionowner”字串。

預設情況下,xmlpolicyfile 類在當前工作目錄中查詢名為 的檔案。系統屬性 cy 可以用於指定另一個不同的檔名和位置。

websphere application server 示例

除命令列示例之外,您可能還想執行這個簡單的程式,該程式為了 ibm websphere application server,version 4.0.2 而被優化。

一個可執行的示例

綜合這些資訊,我們將執行一個簡單的命令列示例。該示例程式包含三個 jar 檔案:

檔案包含允許例項級訪問控制的 jaas 擴充套件框架。它還包含一個 loginmoduleexample 類,這個類從 xml 檔案讀取使用者認證資訊。使用者標識和密碼儲存在 檔案中。使用者組儲存在 檔案中。關於 loginmoduleexample 的更多資訊,請參閱參考資料部分。

該示例包含四個附加的檔案:

policy

在試圖執行這個示例程式之前,請確保更新了 、policy 和 檔案中的路徑。預設情況下,所有的密碼都是“passw0rd”。

示例如何工作

該示例程式提示輸入使用者標識和密碼。它用 檔案中的條目核對所提供的使用者標識和密碼。在認證了使用者之後,程式設法建立一個 userprofile 類例項,修改它並從中讀取。預設情況下,userprofile 類的所有者是 jane(jane)。當 jane 登入時,三個操作全部成功。當 john(john)登入時,只有建立操作成功。當 jane 的經理 lou(lou)登入時,只有第一個和最後一個操作成功。當系統管理員(admin)登入時,操作全部成功。當然,只有當提供的 檔案未被修改時,上述這些才都是真的。

示例安裝

下面的安裝指導假設您正在使用 jdk 1.3 並且已經把檔案解壓縮到 d:jaasexample 目錄。通過將檔案解壓縮到這個目錄,您可以省去一些工作;否則您就必須使用正確的路徑名修改 policy 和 策略檔案。

下面是執行該示例需要做的工作:

下載這個示例的原始檔。

把 和 複製到 jdk jrelibext 目錄(即 d:jdk1.3jrelibext)。

向位於 jdk 的 jrelibsecurity 目錄(即 d:jdk1.3jrelibsecurity)中的 rity 檔案的末尾新增下面的字串:ider=olicyfile。

執行 檔案。

結束語

類例項級授權把訪問控制分離到一個通用框架(該框架使用基於所有權和特定關係的策略)中。然後管理員可以在應用程式的生命週期內更改這些策略。用這種方法擴充套件 jaas 減少了您或另一個程式設計師必須在應用程式生命週期內業務規則發生更改時重寫程式碼的可能性。

通過將關係字串抽象為類可以進一步擴充套件特定關係這個概念。不呼叫 resource 實現類的 fulfills(subject user, string relationship) 方法,而只要呼叫 relationship 實現類中定義的新 fulfills(subject user, resource resource) 方法。這樣就會允許許多 resource 實現類使用相同的關係邏輯。

6.java的安全性

1. the security manager是一個application-wide object ( ritymanager)

每個java application都可以有自己地security manager,但是預設地java application沒有一個security manager

可以通過下面地程式碼得到一個security manager

try

{

ecuritymanager(new securitymanager(“--”));

}

catch( )

{}

2.

jdbc

在 jdbc 2 開發的過程中,sql99 還處在一種變化不定的情況下。現在規範已經完成了,而且資料庫廠商已經採用了部分標準。所以自然地,jdbc 規範就跟著將自己與 sql99 功能的一部分相統一。最新的 jdbc 規範已經採用了 sql99 標準中那些已經被廣泛支援的功能,還有那些在五年內可能會獲得支援的功能。

1. datasource

在jdbc2.0 optional package中,提供了透明的連線池(connection pooling)。

一旦配置了j2ee應用伺服器後,只要用datasource獲取連線(connection),連線池(connection pooling)就會自動的工作。

如果使用者希望建立一個數據庫連線,通過查詢在jndi服務中的datasource,可以從datasource中獲取相應的資料庫連線。

datasource被認為是從jndi中獲取的網路資源。

datasource在池中儲存的物件都實現了pooledconnection介面。

當應用程式向datasource請求一個connection時,它會找到一個可用的pooledconnection物件。

如果連線池空了,它就向connectionpoolecdatasource請求一個新的pooledconnection物件

通過使用 datasource 介面 (jdbc 2.0) 或 drivermanager (jdbc 1.0) 介面,j2ee 元件可以獲得物理資料庫連線物件(connection)。要獲得邏輯(合用的)連線,j2ee 元件必須使用以下這些 jdbc 2.0 合用管理器介面:

ectionpooldatasource 介面,該介面充當合用的 ection 物件的資源管理器連線 factory。每家資料庫伺服器供應商都提供該介面的實現

(例如,oracle 實現 leconnectionpooldatasource 類)。

edconnection 介面,該介面封裝到資料庫的物理連線。同樣,資料庫供應商提供其實現。

對於那些介面和 xa 連線的每一個,都存在一個 xa(x/open 規範)等價定義。

2. resultset

在jdbc2.0中,為了獲得一個uptatable result,在query語句裡必須包含primarykey,並且查詢的內容裡必須來自一個table

ltset介面中定義了三種類型的結果集

type_forward_only

type_scroll_insensitive 這種型別的結果集支援雙向滾動

type_scroll_sensitive

如果要建立一個雙向滾動的resultset,一定要在建立statement的時候使用如下引數

statement stmt = testatement(_scroll_insensitive,

ur_read_only);

3. jdbc驅動程式

連通oracle8.1.6的jdbc

把oracle8.1.6/lib/jdbc/* copy 到 %java_home%/jre/lib/ext/*

如果光copy不ren為是沒有用的。

4. 事務處理

本地事務

ection介面可以控制事務邊界(即開始和結束)。

在事務開始的時候呼叫setautocommit( false ), 而在中止事務時呼叫rollback或commit()方法。這類事務叫本地事務。

分散式事務

但是,在特定的情況下,可能有多個客戶(例如兩個不同的servlet或ejb元件)參與了同一個事務。

或者,客戶在同一個事務中可能會執行跨越多個數據庫的資料庫操作。

jdbc2.0 optional package 同jta一起來實現分散式樣事務。

5. 一些技巧

檢索自動產生的關鍵字

為了解決對獲取自動產生的或自動增加的關鍵字的值的需求,jdbc 3.0 api 現在將獲取這種值變得很輕鬆。要確定任何所產生的關鍵字的值,只要簡單地在語句的 execute() 方法中指定一個可選的標記,表示您有興趣獲取產生的值。您感興趣的程度可以是 rn_generated_keys,也可以是 _generated_keys。在執行這條語句後,所產生的關鍵字的值就會通過從 statement 的例項方法 getgeneratedkeys() 來檢索 resultset 而獲得。resultset 包含了每個所產生的關鍵字的列。清單 1 中的示例建立一個新的作者並返回對應的自動產生的關鍵字。

清單 1. 檢索自動產生的關鍵字

statement stmt = testatement();

// obtain the generated key that results from the query.

uteupdate("insert into authors " +

'(first_name, last_name) " +

"values ('george', 'orwell')",

rn_generated_keys);

resultset rs = eneratedkeys();

if ( () ) {

// retrieve the auto generated key(s).

int key = nt();

}

jta/jts

1.jta/jts基本知識

伺服器實現jts是否對應用程式開發人員來說不是很重要的。

對你來說,應該把jta看作是可用的api。

jta是用來開發distributed tansaction的 api.

而jts定義了支援jta中實現transaction manager 的規範。

javatransaction service (jts) specifies the implementation of a transaction manager which supports the java transaction api (jta) 1.0 specification at the high-level and implements the java mapping of the omg object transaction service (ots) 1.1 specification at the low-level. jts uses the standard corba orb/ts interfaces and internet inter-orb protocol (iiop) for transaction context propagation between jts transaction managers.

a jts transaction manager provides transaction services to the parties involved in distributed transactions: the application server, the resource manager, the standalone transactional application, and the communication resource manager (crm).

2.jta

1.1 事務處理的概念

jta實際上是由兩部分組成的:一個高階的事務性客戶介面和一個低階的 x/open xa介面。

我們關心的是高階客戶介面,因為bean可以訪問它,而且是推薦的客戶應用程式的事務性介面。

低階的xa介面是由ejb伺服器和容器使用來自動協調事務和資源(如資料庫)的

1.1.1事務劃分

a.程式劃分

使用usertransaction啟動jta事務

the usertransaction interface defines the methods that allow an application to explicitly manage transaction boundaries.(from j2ee api document)