特黄特色三级在线观看免费,看黄色片子免费,色综合久,欧美在线视频看看,高潮胡言乱语对白刺激国产,伊人网成人,中文字幕亚洲一碰就硬老熟妇

學(xué)習(xí)啦 > 實(shí)用范文 > 心得體會(huì) > 讀書(shū)心得 > java讀書(shū)心得

java讀書(shū)心得

時(shí)間: 戚苗998 分享

java讀書(shū)心得

  參加這次的java讀書(shū)學(xué)習(xí),規(guī)范是一個(gè)描述接口,語(yǔ)義以及web服務(wù)為了響應(yīng)請(qǐng)求需要經(jīng)常處理的工作的xml文檔。這將使簡(jiǎn)單地服務(wù)方便,快速地被描述和記錄。下面是學(xué)習(xí)啦小編為大家收集整理的java讀書(shū)心得,歡迎大家閱讀。

  java讀書(shū)心得篇1

  首選很感謝Joshua Bloch寫(xiě)的這本書(shū),當(dāng)然更感謝我們的司令翻譯。至少目前我看到的100頁(yè)的內(nèi)容,基本沒(méi)發(fā)現(xiàn)翻譯很別扭的地方,包括錯(cuò)別字也沒(méi)有發(fā)現(xiàn),至少?zèng)]有影響到我對(duì)書(shū)中內(nèi)容的理解。再次感謝。

  在后面的讀書(shū)心得里,我會(huì)根據(jù)我的個(gè)人理解,將書(shū)中的各個(gè)知識(shí)點(diǎn)逐個(gè)和大家分享。 書(shū)中的一些觀點(diǎn)我也不是完全贊同的,呵呵(估計(jì)是我的水平不夠,呵呵呵)。

  我們先看全書(shū)第一個(gè)問(wèn)題:考慮用靜態(tài)工廠方法代替構(gòu)造器。

  也就是,不再使用 new ()這種方式來(lái)獲得一個(gè)類的實(shí)例,而是通過(guò)工廠方法獲得。

  優(yōu)點(diǎn):

  1 有名字

  這個(gè)我體會(huì)還是比較深的,在JDK里,我見(jiàn)過(guò)一個(gè)類的最多的構(gòu)造器數(shù)量,有16個(gè)。大家可以看看 Java.math.BigDecimal 這個(gè)類就知道了。

  就算一個(gè)類的構(gòu)造器有4個(gè)左右,我想你很可能在使用的時(shí)候會(huì)極其注意,不要選錯(cuò)了到底是用哪一個(gè)。

  所以,如果能提供一個(gè)很好命名的方法來(lái)實(shí)現(xiàn)構(gòu)造類,確實(shí)是一個(gè)不錯(cuò)的主意,比如

  BigDecimal.getInstanceFromString(...); 我想這個(gè)名字雖然有點(diǎn)垃圾,但要表達(dá)的意思確實(shí)異常的明確。

  在一些第三方的庫(kù)里面,這種情況更加突出。我許多時(shí)候不得不看看API文檔,來(lái)區(qū)分我的那個(gè)int參數(shù)到底是使用三個(gè)參數(shù)的構(gòu)造器,還是使用四個(gè)參數(shù)的構(gòu)造器。因?yàn)樗麄兲窳恕?/p>

  2 可以單例

  這個(gè)就不用說(shuō)了,你可以在方法里干你要做的任何事情,而new絕對(duì)會(huì)給你一個(gè)新的實(shí)例。

  3 可以返回任何子類型。

  這個(gè)對(duì)于系統(tǒng)的擴(kuò)展是很有用處的。new 已經(jīng)決定了你肯定要這個(gè)類,而靜態(tài)方法卻可以修改,不一定肯定返回你方法所在的類,可以在必要時(shí)替換為一個(gè)子類。

  4 代碼簡(jiǎn)便

  這點(diǎn)我體會(huì)不深,呵呵

  不過(guò)這個(gè)寫(xiě)法我確實(shí)經(jīng)常用

  List list = new ArrayList();

  后面的那個(gè)ArrayList里面的 String就是一個(gè)例子吧。不過(guò)我倒是不是很在意這個(gè),因?yàn)槲液芟矚g這樣寫(xiě)了。

  下面這個(gè)例子看上去確實(shí)不錯(cuò)。呵呵!

  [java] view plain copypublic class Test extends Thread {

  public static void main(String[] args) {

  Test te = Test.newInstance();

  }

  public static Test newInstance() {

  return new Test();

  }

  }

  java讀書(shū)心得篇2

  最近我在慧橋上java的培訓(xùn)課,老師推薦了本不錯(cuò)的java教材《Think in java 》

  看書(shū)要學(xué)會(huì)做筆記,才會(huì)有更大收獲,每天讀30分鐘,希望能堅(jiān)持下去

  今天重新翻了第一章

  Introduction to object 面向?qū)ο笾饕獓@的五個(gè)要點(diǎn)

  1.Everything is an object

  每個(gè)東西都可以看作一個(gè)對(duì)象,它儲(chǔ)存了你所需要的必要信息,你可以通過(guò)特定的請(qǐng)求方式來(lái)向這個(gè)對(duì)象請(qǐng)求你所需要的東西

  2.A Program is a bunch of objects telling each other what to do by sending messages

  一個(gè)程序由很多對(duì)象組成,你可以向?qū)ο蟀l(fā)送消息來(lái)告訴他們做什么和怎樣做

  3.Each object has its own memory made up other objects

  你可以根據(jù)已經(jīng)存在的對(duì)象來(lái)創(chuàng)建新的對(duì)象,這應(yīng)該就是對(duì)象的繼承與重載吧

  4.Every object has a type

  每個(gè)對(duì)象都是類的一個(gè)實(shí)例,都有自己的特定的需要其完成其功能的數(shù)據(jù)類型

  5.All objects of a particular type can receive the same messages

  一個(gè)特定類型的所有對(duì)象能夠獲取同樣的消息

  java讀書(shū)心得篇3

  注:框架可以用word菜單中的 “視圖/文檔結(jié)構(gòu)圖” 看到

  j2ee模式

  value object(值對(duì)象) 用于把數(shù)據(jù)從某個(gè)對(duì)象/層傳遞到其他對(duì)象/層的任意java對(duì)象。

  通常不包含任何業(yè)務(wù)方法。

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

  jsp

  1.jsp的基礎(chǔ)知識(shí)

  __

  _____ | directive (指令)

  | |-- scripting (腳本)

  jsp -------| |__ action (動(dòng)作)

  |

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

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

  a) page指令

  b) include指令

  c) taglib指令

  在jsp的任何地方,以任何順序,一個(gè)頁(yè)面可以包含任意數(shù)量的page指令

  2)scripting(腳本)包括三種類型

  a) ;

  b) ;

  c) ;

  3)action(動(dòng)作)

  標(biāo)準(zhǔn)的動(dòng)作類型有:

  a) ;

  b) ;

  d) ;

  e) ;

  f) ;

  g) ;

  h) ; 日記日記300字http://www.0S.Net.Cn

  1. 注釋: ;

  ;

  2. ;

  session可以不賦值,默認(rèn)為true,如果session=”false”,則在jsp頁(yè)面中,隱含的變量session就不能使用。

  3. 請(qǐng)求控制器結(jié)構(gòu)(request controller)

  也被稱之為jsp model 2 architecture

  這種途徑涉及到使用一個(gè)servlet或一個(gè)jsp作為一個(gè)應(yīng)用程序或一組頁(yè)面的入口點(diǎn)。

  為創(chuàng)建可維護(hù)的jsp系統(tǒng),request controller是最有用的方式之一。

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

  請(qǐng)求控制器的命名模式為: xxxcontroller.jsp

  請(qǐng)求控制器類的命名模式為: xxxrequestcontroller

  2.jsp中的javabean

  jsp三種bean的類型

  1) 頁(yè)面bean

  2) 會(huì)話bean

  3) 應(yīng)用bean

  大多數(shù)的系統(tǒng)會(huì)使用一個(gè)會(huì)話bean來(lái)保持狀態(tài),而對(duì)每一個(gè)頁(yè)面使用一個(gè)頁(yè)面bean 來(lái)對(duì)復(fù)雜的數(shù)據(jù)進(jìn)行表示。

  頁(yè)面bean是一個(gè)模型,而jsp是一個(gè)視圖。

  3.custom tag

  bean是信息的攜帶者,

  而tag更適用于處理信息。

  標(biāo)記庫(kù)包含一個(gè)標(biāo)記庫(kù)描述符(tld)和用于實(shí)現(xiàn)custom tag的java類

  在翻譯階段,jsp容器將使用tld來(lái)驗(yàn)證頁(yè)面中的所有的tag是否都被正確的使用。

  標(biāo)記處理程序只是一個(gè)簡(jiǎn)單的適配器,而真正的邏輯是在另一個(gè)類中實(shí)現(xiàn)的,標(biāo)記處理程序只是提供了一個(gè)供其他的可復(fù)用的類的jsp接口

  servlet

  1.servletconfig

   一個(gè)servletconfig對(duì)象是servlet container在servlet initialization的時(shí)候傳遞給servlet的。

  servletconfig包涵 servletcontext 和 一些 name/value pair (來(lái)自于deployment descriptor)

   servletcontext接口封裝了web應(yīng)用程序的上下文概念。

  2.會(huì)話跟蹤

  1) session

   當(dāng)一個(gè)client請(qǐng)求多個(gè)servlets時(shí),一個(gè)session可以被多個(gè)servlet共享。

   通常情況下,如果server detect到browser支持cookie,那么url就不會(huì)重寫(xiě)。

  2) cookie

   在java servlet中,如果你光 cookie cookie = new cookie(name,value)

  那么當(dāng)用戶退出browser時(shí),cookie會(huì)被刪除掉,而不會(huì)被存儲(chǔ)在客戶端的硬盤(pán)上。

  如果要存儲(chǔ) cookie,需加一句 cookie.setmaxage(200)

   cookie是跟某一個(gè)server相關(guān)的,運(yùn)行在同一個(gè)server上的servlet共享一個(gè)cookie.

  3) url rewriting

  在使用url rewriting來(lái)維護(hù)session id的時(shí)候,每一次http請(qǐng)求都需要encodeurl()

  典型的用在兩個(gè)地方

  1) out.print(“form action=\” ”);

  out.print(response.encodeurl(“sessionexample”));

  out.print(“form action=\” ”);

  out.print(“method = get>;”);

  2) out.print(“

  ;

  out.print(response.encodeurl(“sessionexample?database=foo&datavalue=bar”));

  out.println(“\” >;url encoded ;”);

  3.singlethreadmodel

  默認(rèn)的,每一個(gè)servlet definition in a container只有一個(gè)servlet class的實(shí)例。

  只有實(shí)現(xiàn)了singlethreadmodel,container才會(huì)讓servlet有多個(gè)實(shí)例。

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

  singlethreadmodel(沒(méi)有方法)

  保證servlet在同一時(shí)刻只處理一個(gè)客戶的請(qǐng)求。

  singlethreadmodel是耗費(fèi)資源的,特別是當(dāng)有大量的請(qǐng)求發(fā)送給servlet時(shí),singlethreadmodel的作用是使包容器以同步時(shí)鐘的方式調(diào)用service方法。

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

  single thread model一般使用在需要響應(yīng)一個(gè)heavy request的時(shí)候,比如是一個(gè)需要和數(shù)據(jù)庫(kù)打交道的連接。

  2. 在重載servlet地init( )方法后,一定要記得調(diào)用super.init( );

  3. the client通過(guò)發(fā)送一個(gè)blank line表示它已經(jīng)結(jié)束request

  而the server通過(guò)關(guān)閉the socket來(lái)表示response已結(jié)束了。

  4. 一個(gè)http servlet可以送三種東西給client

  1) a single status code

  2) any number of http headers

  3) a response body

  5. servlet之間信息共享的一個(gè)最簡(jiǎn)單的方法就是

  system.getproperties().put(“key”,”value”);

  6. post和get

  post:將form內(nèi)各字段名稱和內(nèi)容放置在html header內(nèi)傳送給server

  get: ?之后的查詢字符串要使用urlencode,經(jīng)過(guò)urlencode后,這個(gè)字符串不再帶有空格,以后將在server上恢復(fù)所帶有的空格。

  get是web上最經(jīng)常使用的一種請(qǐng)求方法,每個(gè)超鏈接都使用這種方法。

  7. web.xml就是web applicatin 的deployment descriptor

  作用有:組織各類元素

  設(shè)置init param

  設(shè)置安全性

  8. request dispatcher用來(lái)把接收到的request forward processing到另一個(gè)servlet

  要在一個(gè)response里包含另一個(gè)servlet的output時(shí),也要用到request dispatcher.

  9. servlet和jsp在同一個(gè)jvm中,可以通過(guò)serveltcontext的

  setattribute( )

  getattribute( )

  removeattribute( )

  來(lái)共享對(duì)象

  10. 利用request.getparameter( )得到的string存在字符集問(wèn)題。

  可以用 strtitle = request.getparameter(“title”);

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

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

  string encoding = response.getcharacterencoding();

  //確定application server用什么編碼來(lái)讀取輸入的。

  strtitle = new string(strtitle.getbytes(encoding),”gb2312”);

  xml

  1.xml基礎(chǔ)知識(shí)

  1. 一個(gè)xml文檔可以分成兩個(gè)基本部分:

  首部( header )

  內(nèi)容( content )

  2. xml名字空間規(guī)范中指定:

  xml文檔中的每一個(gè)元素都處在一個(gè)名字空間中;如果沒(méi)有指定的名字空間,缺省的名字空間就是和該元素相關(guān)聯(lián)的名字空間。

  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 ;

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

  5. 標(biāo)簽( tags ) 實(shí)際上包含了“元素”( elements ) 和 “屬性”( attributes )兩部分。

  用元素( elements )來(lái)描述有規(guī)律的數(shù)據(jù)。

  用屬性( attributes ) 來(lái)描述系統(tǒng)數(shù)據(jù)。

  如果你有一些數(shù)據(jù)要提供給某個(gè)應(yīng)用程序,該數(shù)據(jù)就可能要用到一個(gè)元素。

  如果該數(shù)據(jù)用于分類,或者用于告知應(yīng)用程序如何處理某部分?jǐn)?shù)據(jù),或者該數(shù)據(jù)從來(lái)沒(méi)有直接對(duì)客戶程序公開(kāi),那么它就可能成為一種屬性。

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

  7.org.xml.sax.reader

  /|\

  org.xm.l.sax.xmlreader

  /|\

  org.apche.xerces.parsers.saxparser

  2.webservice

  2.1 webservice的基本概念

  webservice是一種可以接收從internet或者intranet上的其它系統(tǒng)中傳遞過(guò)來(lái)的請(qǐng)求,輕量級(jí)的獨(dú)立的通訊技術(shù)。

  這種技術(shù)允許網(wǎng)絡(luò)上的所有系統(tǒng)進(jìn)行交互。隨著技術(shù)的發(fā)展,一個(gè)web服務(wù)可以包含額外的指定功能并且可以在多個(gè)b2b應(yīng)用中協(xié)作通訊。

  web服務(wù)可以理解請(qǐng)求中上下文的關(guān)系,并且在每一個(gè)特定的情況下產(chǎn)生動(dòng)態(tài)的結(jié)果。這些服務(wù)會(huì)根據(jù)用戶的身份,地點(diǎn)以及產(chǎn)生請(qǐng)求的原因來(lái)改變不同的處理,用以產(chǎn)生一個(gè)唯一的,定制的方案。這種協(xié)作機(jī)制對(duì)那些只對(duì)最終結(jié)果有興趣的用戶來(lái)說(shuō),是完全透明的。

  uddi

  在用戶能夠調(diào)用web服務(wù)之前,必須確定這個(gè)服務(wù)內(nèi)包含哪些商務(wù)方法,找到被調(diào)用的接口定義,還要在服務(wù)端來(lái)編制軟件。所以,我們需要一種方法來(lái)發(fā)布我們的web服務(wù)。

  uddi (universal description, discovery, and integration) 是一個(gè)主要針對(duì)web服務(wù)供應(yīng)商和使用者的新項(xiàng)目。uddi 項(xiàng)目中的成員可以通過(guò)uddi business registry (ubr) 來(lái)操作web服務(wù)的調(diào)用,ubr是一個(gè)全球性的服務(wù)。

  web服務(wù)供應(yīng)商可以在ubr中描述并且注冊(cè)他們的服務(wù)。

  用戶可以在ubr中查找并定位那些他們需要的服務(wù)。

  uddi是一種根據(jù)描述文檔來(lái)引導(dǎo)系統(tǒng)查找相應(yīng)服務(wù)的機(jī)制。

  uddi包含標(biāo)準(zhǔn)的“白皮書(shū)”類型的商業(yè)查詢方式,

  “黃皮書(shū)”類型的局部查找,以及

  “綠皮書(shū)”類型的服務(wù)類型查找。

  uddi利用soap消息機(jī)制(標(biāo)準(zhǔn)的xml/http)來(lái)發(fā)布,編輯,瀏覽以及查找注冊(cè)信息。它采用xml格式來(lái)封裝各種不同類型的數(shù)據(jù),并且發(fā)送到注冊(cè)中心或者由注冊(cè)中心來(lái)返回需要的數(shù)據(jù)。

  wsdl

  對(duì)于商業(yè)用戶來(lái)說(shuō),要找到一個(gè)自己需要使用的服務(wù),他必須知道如何來(lái)調(diào)用。

  wsdl (web services description language) 規(guī)范是一個(gè)描述接口,語(yǔ)義以及web服務(wù)為了響應(yīng)請(qǐng)求需要經(jīng)常處理的工作的xml文檔。這將使簡(jiǎn)單地服務(wù)方便,快速地被描述和記錄。

  以下是一個(gè)wsdl的樣例:

  targetnamespace="http://example/stockquote.wsdl"

  xmlns:tns="http://example/stockquote.wsdl" (5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)

  xmlns:xsd1="http://example/stockquote.xsd"

  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

  xmlns="http://schemas.xmlsoap.org/wsdl/">;

  xmlns="http://www.w3.org/XX/10/xmlschema">;

  type="tns:stockquoteporttype">;

  transport="http://schemas.xmlsoap.org/soap/http"/>;

  soapaction="http://example/getlasttradeprice"/>;

  ;my first service;

  它包含了以下的關(guān)鍵信息:

  消息的描述和格式定義可以通過(guò)xml文檔中的;和; 標(biāo)記來(lái)傳送。

  ; 標(biāo)記中表示了消息傳送機(jī)制。 (e.g. request-only, request-response, response-only) 。

  ; 標(biāo)記指定了編碼的規(guī)范 。

  ; 標(biāo)記中表示服務(wù)所處的位置 (url)。

  wsdl在uddi中總是作為一個(gè)接口描述文檔。因?yàn)閡ddi是一個(gè)通用的用來(lái)注冊(cè)wsdl規(guī)范的地方,uddi的規(guī)范并不限制任何類型或者格式描述文檔。這些文檔可能是一個(gè)wsdl文檔,或者是一個(gè)正規(guī)的包含導(dǎo)向文檔的web頁(yè)面,也可能只是一個(gè)包含聯(lián)系信息的電子郵件地址。

  現(xiàn)在java提供了一個(gè) java api for wsdl (jwsdl)規(guī)范。它提供了一套能快速處理wsdl文檔的方法,并且不用直接對(duì)xml文檔進(jìn)行操作,它會(huì)比jaxp更方便,更快速。

  soap

  當(dāng)商業(yè)用戶通過(guò)uddi找到你的wsdl描述文檔后,他通過(guò)可以simple object access protocol (soap) 調(diào)用你建立的web服務(wù)中的一個(gè)或多個(gè)操作。

  soap是xml文檔形式的調(diào)用商業(yè)方法的規(guī)范,它可以支持不同的底層接口,象http(s)或者smtp。

  之所以使用xml是因?yàn)樗莫?dú)立于編程語(yǔ)言,良好的可擴(kuò)展性以及強(qiáng)大的工業(yè)支持。之所以使用http是因?yàn)閹缀跛械木W(wǎng)絡(luò)系統(tǒng)都可以用這種協(xié)議來(lái)通信,由于它是一種簡(jiǎn)單協(xié)議,所以可以與任何系統(tǒng)結(jié)合,還有一個(gè)原因就是它可以利用80端口來(lái)穿越過(guò)防火墻。

  soap的強(qiáng)大是因?yàn)樗?jiǎn)單。soap是一種輕量級(jí)的,非常容易理解的技術(shù),并且很容易實(shí)現(xiàn)。它有工業(yè)支持,可以從各主要的電子商務(wù)平臺(tái)供應(yīng)商那里獲得。

  從技術(shù)角度來(lái)看,soap詳細(xì)指明了如何響應(yīng)不同的請(qǐng)求以及如何對(duì)參數(shù)編碼。一個(gè)soap封裝了可選的頭信息和正文,并且通常使用http post方法來(lái)傳送到一個(gè)http 服務(wù)器,當(dāng)然其他方法也是可以的,例如smtp。soap同時(shí)支持消息傳送和遠(yuǎn)程過(guò)程調(diào)用。以下是一個(gè)soap請(qǐng)求。

  post /stockquote http/1.1

  host: www.stockquoteserver

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

  content-length: nnnn

  soapaction: "some-uri"

  xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"

  〖5〗〖6〗〖7〗〖8〗〖9〗〖10〗〖11〗〖12〗〖13〗〖14〗〖15〗

  soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"/>;

  ;sunw;

  jaxr

  為了支持uddi在java平臺(tái)上的功能,java apis for xml registries (jaxr)允許開(kāi)發(fā)者來(lái)訪問(wèn)注冊(cè)中心。

  值得注意的是,jaxr并不是建立web服務(wù)必需的,你可以利用其他常用的xml apis來(lái)直接集成這些協(xié)議。

  jaxr是一個(gè)方便的api,它提供了java api來(lái)發(fā)布,查找以及編輯那些注冊(cè)信息。它的重點(diǎn)在于基于xml的b2b應(yīng)用,復(fù)雜的地址本查找以及對(duì)xml消息訂閱的支持等web服務(wù)。

  它也可以用來(lái)訪問(wèn)其他類型的注冊(cè)中心,象ebxml注冊(cè)中心。

  這些對(duì)web服務(wù)的注冊(cè)信息進(jìn)行的操作,可以使用當(dāng)前的一些web服務(wù)工具來(lái)完成(例如第三方的soap和ebxml消息工具)。另外,當(dāng)jaxp提供了一致并具有針對(duì)性的api來(lái)完成這些操作,這將使開(kāi)發(fā)變得更加容易。

  jax/rpc

  為了使開(kāi)發(fā)人員專注于建立象soap那樣的基于xml的請(qǐng)求,jcp正在開(kāi)發(fā)基于rpc (jax/rpc) 的java api。jax/rpc是用來(lái)發(fā)送和接收方法調(diào)用請(qǐng)求的,它基于xml協(xié)議,象soap,或者其他的象xmlp (xml protocol,要了解更多可以參考http://www.w3.org/XX/xp/)。jax/rpc使你不用再關(guān)注這些協(xié)議的規(guī)范,使應(yīng)用的開(kāi)發(fā)更快速。不久,開(kāi)發(fā)人員就不用直接以xml表示方法調(diào)用了。

  目前有很多第三方實(shí)現(xiàn)了soap,開(kāi)發(fā)人員可以在不同的層次上調(diào)用soap,并選擇使用哪一種。將來(lái),jax/rpc會(huì)取代這些apis并提供一個(gè)統(tǒng)一的接口來(lái)構(gòu)造以及處理soap rpc請(qǐng)求。

  在接收一個(gè)從商業(yè)伙伴那里過(guò)來(lái)的soap請(qǐng)求的時(shí)候,一個(gè)java servlet用jax/rpc來(lái)接收這個(gè)基于xml的請(qǐng)求。一旦接收到請(qǐng)求后,servlet會(huì)調(diào)用商務(wù)方法,并且把結(jié)果回復(fù)給商業(yè)伙伴。

  jaxm

  當(dāng)從商業(yè)合作伙伴那里接收一個(gè)web服務(wù)的請(qǐng)求時(shí),我們需要java api實(shí)現(xiàn)一個(gè)servlet來(lái)處理ebxml消息,就象我們用jax/rpc來(lái)處理soap請(qǐng)求一樣。

  java api for xml messaging (jaxm) 是集成xml消息標(biāo)準(zhǔn)(象ebxml消息或者soap消息)的規(guī)范。

  這個(gè)api是用來(lái)推動(dòng)xml消息處理的,它檢測(cè)那些預(yù)定單的消息格式以及約束。它控制了所有的消息封裝機(jī)制,用一種直觀的方式分割了消息中的信息,象路由信息,發(fā)貨單。這樣,開(kāi)發(fā)人員只要關(guān)注消息的有效負(fù)載,而不用去擔(dān)心那些消息的重復(fù)處理。

  目前的開(kāi)發(fā)人員用jaxp來(lái)實(shí)現(xiàn)jaxm將要提供的功能,jaxm將會(huì)提供一套非常具有針對(duì)性的api來(lái)處理基于xml的消息傳送。這將大大簡(jiǎn)化開(kāi)發(fā)人員的代碼,并使它們具有統(tǒng)一的接口。

  jaxm和jax/rpc的差別在于處理消息導(dǎo)向的中間件以及遠(yuǎn)程過(guò)程調(diào)用的不同。jaxm注重于消息導(dǎo)向,而jax/rpc是用來(lái)完成遠(yuǎn)程過(guò)程調(diào)用的。以下是圖解。

  請(qǐng)注意,在jaxm 和 jax/rpc技術(shù)成熟之前,開(kāi)發(fā)人員還是依賴于第三方的soap apis,象apache soap, idooxoap, 以及 glue。當(dāng)jaxm 和 jax/rpc正式發(fā)布后,它將為當(dāng)前不同的soap和ebxml消息提供統(tǒng)一的接口。就象jdbc位多種不同的數(shù)據(jù)庫(kù)提供統(tǒng)一的接口。

  jaxb

  xml綁定技術(shù)可以把xml文檔和java對(duì)象進(jìn)行自由轉(zhuǎn)換。

  用jaxb,你可以在后臺(tái)的ejb層,把xml文檔轉(zhuǎn)換成java對(duì)象。同樣你也可以把從ejb中取出的java對(duì)象轉(zhuǎn)換成xml文檔返回給用戶。

  jaxb接口提供了比sax和dom更高級(jí)的方法來(lái)處理xml文檔。它提供的特性可以在xml數(shù)據(jù)和java類之間互相映射,提供了一個(gè)簡(jiǎn)單的方法來(lái)轉(zhuǎn)換xml數(shù)據(jù)。它比逐個(gè)解析標(biāo)記更簡(jiǎn)單。

  2.2 建立weservice的步驟

  在建立weservice的時(shí)候,有三個(gè)主要步驟:

  1.建立客戶端聯(lián)接

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

  2.實(shí)現(xiàn)web服務(wù)

  包括工作流,數(shù)據(jù)傳送,商業(yè)邏輯以及數(shù)據(jù)訪問(wèn)。這些功能是隱藏在web服務(wù)后,并且為客戶端工作的。

  3.聯(lián)接后臺(tái)系統(tǒng)

  這個(gè)系統(tǒng)可能包括一個(gè)或多個(gè)數(shù)據(jù)庫(kù),現(xiàn)存的企業(yè)信息系統(tǒng),商業(yè)合作伙伴自己的系統(tǒng)或者web服務(wù),以及在多個(gè)系統(tǒng)中共享的數(shù)據(jù)。

  基于j2ee的web服務(wù)的核心構(gòu)架:

  rmi

  1. rmi-iiop

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

  rmi-iiop 是rmi的一個(gè)特殊版本,rmi-iiop可以和corba兼容,rmi-iiop使用java.rmi包和javax.rmi

  jaf(java活動(dòng)構(gòu)架)

  開(kāi)發(fā)者可以使用jaf來(lái)決定任意一塊數(shù)據(jù)的類型、封裝對(duì)數(shù)據(jù)的訪問(wèn)、尋找合適的操作、實(shí)例化相關(guān)的bean來(lái)執(zhí)行這些操作等。

  例如,javamail就是使用jaf根據(jù)mime類型來(lái)決定實(shí)例化那一個(gè)對(duì)象。

  ejb

  1. ejb組件實(shí)現(xiàn)代碼的限制

  ejb組件的約束

  ejb的開(kāi)發(fā)者并不需要在ejb的組件實(shí)現(xiàn)代碼中編寫(xiě)系統(tǒng)級(jí)的服務(wù),ejb提供商/開(kāi)發(fā)

  者需知道并且嚴(yán)格地遵守一些限制,這些限制與開(kāi)發(fā)穩(wěn)定的和可移植的ejb組件的利益有 <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

  關(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ù)完成鍵盤(pán)的輸入和顯示輸出。約束它的原因是服務(wù)器方的商業(yè)組件意味著提供商業(yè)功能而不包括用戶界面和鍵盤(pán)的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.直接讀寫(xiě)文件描述符。

  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,java.net.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)題。 3 4 5 6 7 8 9 10 11 12 13 14 15

  可能的問(wèn)題

  通常,ejb組件在容器之間的移植不可避免地與如下問(wèn)題相關(guān):

  1.它需要依靠的受限制的特點(diǎn)在特定ejb容器中沒(méi)有得到加強(qiáng)。

  2.它需要依靠的非標(biāo)準(zhǔn)的服務(wù)從容器中可獲得。

  為了保證ejb組件的可移植性和一致的行為,你應(yīng)該使用一個(gè)具有與java2平臺(tái)安全

  策略集相一致的策略集的容器來(lái)測(cè)試ejb組件,并且其加強(qiáng)了前述的編程限制。

  總結(jié)

  ejb組件開(kāi)發(fā)者應(yīng)該知道這些推薦的關(guān)于ejb組件的編程限制,明白它們的重要性,并且從組件的穩(wěn)定性和可移植性利益方面考慮來(lái)遵循它們。因?yàn)檫@些編程限制能阻止你使用標(biāo)準(zhǔn)的java語(yǔ)言的特點(diǎn),違背了這些編程限制在編譯時(shí)不會(huì)知道,并且加強(qiáng)這些限制也不是ejb容器的責(zé)任。所有這些原因都使你應(yīng)很小心地遵守這些編程限制,這些限制在組件的合同中已經(jīng)成為了一個(gè)條款,并且它們對(duì)于建造可靠的、可移植的組件是非常重要的。

  2. 優(yōu)化ejb

  entity bean為在應(yīng)用程序和設(shè)計(jì)中描述持久化商業(yè)對(duì)象(persistent business objec ts)提供了一個(gè)清晰的模型。在java對(duì)象模型中,簡(jiǎn)單對(duì)象通常都是以一種簡(jiǎn)單的方式進(jìn)行處理但是,很多商業(yè)對(duì)象所需要的事務(wù)化的持久性管理沒(méi)有得到實(shí)現(xiàn)。entity bean將持久化機(jī)制封裝在容器提供的服務(wù)里,并且隱藏了所有的復(fù)雜性。entity bean允許應(yīng)用程序操縱他們就像處理一個(gè)一般的java對(duì)象應(yīng)用。除了從調(diào)用代碼中隱藏持久化的形式和機(jī)制外,entity bean還允許ejb容器對(duì)對(duì)象的持久化進(jìn)行優(yōu)化,保證數(shù)據(jù)存儲(chǔ)具有開(kāi)放性,靈活性,以及可部署性。在一些基于ejb技術(shù)的項(xiàng)目中,廣泛的使用oo技術(shù)導(dǎo)致了對(duì)entity bean的大量使用,sun的工程師們已經(jīng)積累了很多使用entity bean的經(jīng)驗(yàn),這篇文章就詳細(xì)闡述的這些卡發(fā)經(jīng)驗(yàn):

  *探索各種優(yōu)化方法

  *提供性能優(yōu)化和提高適用性的法則和建議

  *討論如何避免一些教訓(xùn)。

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

  cmp方式不僅減少了編碼的工作量,而且在container中以及container產(chǎn)生的數(shù)據(jù)庫(kù)訪問(wèn)代碼中包括了許多優(yōu)化的可能。container可以訪問(wèn)內(nèi)存緩沖中的bean,這就允許它可以監(jiān)視緩沖中的任何變化。這樣的話就在事物沒(méi)有提交之前,如果緩存的數(shù)據(jù)沒(méi)有變化就不用寫(xiě)到數(shù)據(jù)庫(kù)中。就可以避免許多不必要的數(shù)據(jù)庫(kù)寫(xiě)操作。另外一個(gè)優(yōu)化是在調(diào)用find方法的時(shí)候。通常情況下find方法需要進(jìn)行以下數(shù)據(jù)庫(kù)操作:

  查找數(shù)據(jù)庫(kù)中的紀(jì)錄并且獲得主鍵

  將紀(jì)錄數(shù)據(jù)裝入緩存

  cmp允許將這兩步操作優(yōu)化為一步就可以搞定。[具體怎么做我也沒(méi)弄明白,原文沒(méi)有具體闡述]

  法則2:寫(xiě)代碼時(shí)盡量保證對(duì)bmp和cmp都支持

  許多情況下,ejb的開(kāi)發(fā)者可能無(wú)法控制他們寫(xiě)的bean怎么樣被部署,以及使用的container是不是支持cmp.

  一個(gè)有效的解決方案是,將商業(yè)邏輯的編碼完全和持久化機(jī)制分離。再cmp類中實(shí)現(xiàn)商業(yè)邏輯,然后再編寫(xiě)一個(gè)bmp類,用該類繼承cmp類。這樣的話,所有的商業(yè)邏輯都在cmp類中,而持久化機(jī)制在bmp中實(shí)現(xiàn)。[我覺(jué)得這種情況在實(shí)際工作中很少遇到,但是作者解決問(wèn)題的思路值得學(xué)習(xí)]

  法則3:把ejbstore中的數(shù)據(jù)庫(kù)訪問(wèn)減小到最少。

  如果使用bmp,設(shè)置一個(gè)緩存數(shù)據(jù)改變標(biāo)志dirty非常有用。所有改變數(shù)據(jù)庫(kù)中底層數(shù)據(jù)的操作,都要設(shè)置dirty,而在ejbstore()中,首先檢測(cè)dirty的值,如果dirty的值沒(méi)有改變,表明目前數(shù)據(jù)庫(kù)中的數(shù)據(jù)與緩存的一致,就不必進(jìn)行數(shù)據(jù)庫(kù)操作了,反之,就要把緩存數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)。

  法則4:總是將從lookup和find中獲得的引用進(jìn)行緩存。(cache)

  引用緩存對(duì)session bean和entity bean 都是適用的。

  通過(guò)jndi lookup獲得ejb資源。比如datasource,bean的引用等等都要付出相當(dāng)大的代價(jià)。因此應(yīng)該避免多余的lookup.可以這樣做:

  將這些引用定義為實(shí)例變量。

  從setentitycontext(session bean使用setsessioncontext)方法查找他們。setentitycontext方法對(duì)于一個(gè)bean實(shí)例只執(zhí)行一次,所有的相關(guān)引用都在這一次中進(jìn)行查找,這樣查找的代價(jià)就不是那么昂貴了。應(yīng)該避免在其他方法中查找引用。尤其是訪問(wèn)數(shù)據(jù)庫(kù)的方法:ejbload()和ejbstore(),如果在這些頻繁調(diào)用的方法中進(jìn)行datasource的查找,勢(shì)必造成時(shí)間的浪費(fèi)。

  調(diào)用其他entity bean的finder方法也是一種重量級(jí)的調(diào)用。多次調(diào)用finder()方法的代價(jià)非常高。如果這種引用不適合放在setentitycontext這樣的初始化時(shí)執(zhí)行的方法中執(zhí)行,就應(yīng)該在適當(dāng)?shù)臅r(shí)候緩存finder的執(zhí)行結(jié)果。只是要注意的是,如果這個(gè)引用只對(duì)當(dāng)前的entity有效,你就需要在bean從緩沖池中取出來(lái)代表另外一個(gè)實(shí)體時(shí)清除掉這些引用。,這些操作應(yīng)該在ejbactivate()中進(jìn)行。

  法則5:總是使用prepare statements

  這條優(yōu)化法則適用于所有訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的操作。

  數(shù)據(jù)庫(kù)在處理每一個(gè)sql statement的時(shí)候,執(zhí)行前都要對(duì)statement進(jìn)行編譯。一些數(shù)據(jù)庫(kù)具有緩存statement和statement的編譯后形式的功能。數(shù)據(jù)庫(kù)可以把新的statement和緩存中的進(jìn)行匹配。然而,如果要使用這一優(yōu)化特性,新的statement要必須和緩存中的statement完全匹配。

  對(duì)于non-prepared statement,數(shù)據(jù)和statement本身作為一個(gè)字符串傳遞,這樣由于前后調(diào)用的數(shù)據(jù)不同而不能匹配,就導(dǎo)致無(wú)法使用這種優(yōu)化。而對(duì)于prepared statement,數(shù)據(jù)和statement是分開(kāi)傳遞給數(shù)據(jù)庫(kù)的,這樣statement就可以和cache中已編譯的statement進(jìn)行匹配。statement就不必每次都進(jìn)行編譯操作。從而使用該優(yōu)化屬性。

  【5】【6】【7】【8】【9】【10】【11】【12】【13】【14】【15】

  這項(xiàng)技術(shù)在一些小型的數(shù)據(jù)庫(kù)訪問(wèn)中能夠減少statement將近90%的執(zhí)行時(shí)間。

  法則6:完全關(guān)閉所有的statement

  在編寫(xiě)bmp的數(shù)據(jù)庫(kù)訪問(wèn)代碼時(shí),記住一定要在數(shù)據(jù)庫(kù)訪問(wèn)調(diào)用之后關(guān)閉statement,因?yàn)槊總€(gè)打開(kāi)的statement對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的一個(gè)打開(kāi)的游標(biāo)。

  security

  1.加密

  對(duì)稱加密

  (1)分組密碼

  (2)流密碼

  常用的對(duì)稱加密算法:

  des和tripledes

  blowfish

  rc4

  aes

  非對(duì)稱加密

  常用的非對(duì)稱加密算法

  rsa

  elgamal

  會(huì)話密鑰加密(對(duì)稱加密和非對(duì)稱加密一起使用)

  常用的會(huì)話密鑰加密協(xié)議

  s/mime

  pgp

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

  比如:http和tcp/ip之間

  ssl 提供了服務(wù)器端認(rèn)證和可選的客戶端認(rèn)證,保密性和數(shù)據(jù)完整性。

  提供基于ssl方式的傳輸加密和認(rèn)證,確保以下三種安全防護(hù):

  數(shù)據(jù)的機(jī)密性和準(zhǔn)確性、

  服務(wù)器端認(rèn)證

  客戶端認(rèn)證。

  客戶端認(rèn)證比服務(wù)器端認(rèn)證不很普遍的原因是每一個(gè)要被認(rèn)證的客戶都必須有一張verisign這樣的ca簽發(fā)的證書(shū)。

  通常,在進(jìn)行身份認(rèn)證的時(shí)候,應(yīng)當(dāng)只接受一個(gè)ca,這個(gè)ca的名字包含在客戶證書(shū)中。

  由于不可能隨意創(chuàng)建一個(gè)由指定ca簽發(fā)的證書(shū),所以這可以有效的防御通過(guò)偽造證書(shū)來(lái)進(jìn)行的攻擊嘗試。

  2.認(rèn)證(authentication)

  認(rèn)證就是確定一條消息或一個(gè)用戶的可靠性的過(guò)程。

  1.消息摘要

  md5

  sha和sha-1

  2.消息認(rèn)證碼(message authientication codes,mac)

  3.數(shù)字簽名

  用戶可以用自己的密鑰對(duì)信息加以處理,由于密鑰僅為本人所有,這樣就產(chǎn)生了別人無(wú)法生成的文件,也就形成了數(shù)字簽名

  數(shù)字簽名可以

  1)保證數(shù)據(jù)的完整性

  2)驗(yàn)證用戶的身份

  數(shù)字簽名采用一個(gè)人的私鑰計(jì)算出來(lái),然后用公鑰去檢驗(yàn)。

  hash算法 私鑰加密

  原報(bào)文 ――――――>;報(bào)文摘要( message digest ) ―――――>;數(shù)字簽名

  原報(bào)文和數(shù)字簽名一起被發(fā)送到接受者那里,接受者用同樣的hash算法得到報(bào)文摘要,然后用發(fā)送者的公鑰解開(kāi)數(shù)字簽名。

  比較是否相同,則可以確定報(bào)文確定來(lái)自發(fā)送者。

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

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

  因此發(fā)送方不是單單地發(fā)送公鑰(public key),而是發(fā)送一個(gè)包含公鑰(public key)的數(shù)字證書(shū)(cetificate )。

  4.數(shù)字證書(shū)

  數(shù)字證書(shū)是一個(gè)經(jīng)證書(shū)授權(quán)中心數(shù)字簽名的包含公開(kāi)密鑰所有者信息以及公開(kāi)密鑰的文件。

  數(shù)字證書(shū)cetificate中包括:

  i. 用戶的公鑰(public key)

  ii. 用戶的一些信息,如姓名,email

  iii. 發(fā)行機(jī)構(gòu)的數(shù)字簽名(digital signature), 用于保證證書(shū)的可信度

  iv. 發(fā)行機(jī)構(gòu)的一些信息

  數(shù)字證書(shū)的格式遵循x.509國(guó)際標(biāo)準(zhǔn)。

  注意:一個(gè)數(shù)字證書(shū)certificate并不適用于多種browser,甚至一種browser的多個(gè)版本。

  數(shù)字標(biāo)識(shí)由公用密鑰、私人密鑰和數(shù)字簽名三部分組成。

  當(dāng)在郵件中添加數(shù)字簽名時(shí),您就把數(shù)字簽名和公用密鑰加入到郵件中。數(shù)字簽名和公用密鑰統(tǒng)稱為證書(shū)。您可以使用 outlook express 來(lái)指定他人向您發(fā)送加密郵件時(shí)所需使用的證書(shū)。這個(gè)證書(shū)可以不同于您的簽名證書(shū)。

  收件人可以使用您的數(shù)字簽名來(lái)驗(yàn)證您的身份,并可使用公用密鑰給您發(fā)送加密郵件,這些郵件必須用您的私人密鑰才能閱讀。

  要發(fā)送加密郵件,您的通訊簿必須包含收件人的數(shù)字標(biāo)識(shí)。這樣,您就可以使用他們的公用密鑰來(lái)加密郵件了。當(dāng)收件人收到加密郵件后,用他們的私人密鑰來(lái)對(duì)郵件進(jìn)行解密才能閱讀。

  在能夠發(fā)送帶有數(shù)字簽名的郵件之前,您必須獲得數(shù)字標(biāo)識(shí)。如果您正在發(fā)送加密郵件,您的通訊簿中必須包含每位收件人的數(shù)字標(biāo)識(shí)。

  數(shù)字證書(shū),可以是個(gè)人證書(shū)或 web 站點(diǎn)證書(shū),用于將身份與"公開(kāi)密鑰"關(guān)聯(lián)。只有證書(shū)的所有者才知道允許所有者"解密"或進(jìn)行"數(shù)字簽名"的相應(yīng)"私人密鑰"。當(dāng)您將自己的證書(shū)發(fā)送給其他人時(shí),實(shí)際上發(fā)給他們的是您的公開(kāi)密鑰,這樣他們就可以向您發(fā)送只能由您使用私人密鑰解密和讀取的加密信息。

  通過(guò)瀏覽器使用數(shù)字證書(shū),必須先要設(shè)置瀏覽器軟件 internet explorer 或 netscape使用此證書(shū),才能開(kāi)始發(fā)送加密或需要數(shù)字簽名的信息。訪問(wèn)安全的 web 站點(diǎn)(以"https"打頭的站點(diǎn))時(shí),該站點(diǎn)將自動(dòng)向您發(fā)送他們的web站點(diǎn)證書(shū)。

  3.ca(證書(shū)授證中心)

  ca機(jī)構(gòu),又稱為證書(shū)授證(certificate authority)中心,作為電子商務(wù)交易中受信任的第三方,承擔(dān)公鑰體系中公鑰的合法性檢驗(yàn)的責(zé)任。ca中心為每個(gè)使用公開(kāi)密鑰的用戶發(fā)放一個(gè)數(shù)字證書(shū),數(shù)字證書(shū)的作用是證明證書(shū)中列出的用戶合法擁有證書(shū)中列出的公開(kāi)密鑰。ca機(jī)構(gòu)的數(shù)字簽名使得攻擊者不能偽造和篡改證書(shū)。在set交易中,ca不僅對(duì)持卡人、商戶發(fā)放證書(shū),還要對(duì)獲款的銀行、網(wǎng)關(guān)發(fā)放證書(shū)。它負(fù)責(zé)產(chǎn)生、分配并管理所有參與網(wǎng)上交易的個(gè)體所需的數(shù)字證書(shū),因此是安全電子交易的核心環(huán)節(jié)。

  〖5〗〖6〗〖7〗〖8〗〖9〗〖10〗〖11〗〖12〗〖13〗〖14〗〖15〗

  對(duì)證書(shū)的信任基于對(duì)根證書(shū)的信任. 例如在申請(qǐng)sheca的個(gè)人數(shù)字證書(shū)前,需要先下載根證書(shū),然后再進(jìn)行各類證書(shū)的申請(qǐng)。

  下載根證書(shū)的目的:

  網(wǎng)絡(luò)服務(wù)器驗(yàn)證(s);安全電子郵件(e)

  申請(qǐng)個(gè)人數(shù)字證書(shū)可以為internet用戶提供發(fā)送電子郵件的安全和訪問(wèn)需要安全連接(需要客戶證書(shū))的站點(diǎn)。

  1)個(gè)人數(shù)字證書(shū)

  a.個(gè)人身份證書(shū)

  個(gè)人身份證書(shū)是用來(lái)表明和驗(yàn)證個(gè)人在網(wǎng)絡(luò)上的身份的證書(shū),它確保了網(wǎng)上交易和作業(yè)的安全性和可靠性。可應(yīng)用于:網(wǎng)上炒股、網(wǎng)上理財(cái)、網(wǎng)上保險(xiǎn)、網(wǎng)上繳費(fèi)、網(wǎng)上購(gòu)物、網(wǎng)上辦公等等。個(gè)人身份證書(shū)可以存儲(chǔ)在軟盤(pán)或ic卡中。

  b.個(gè)人安全電子郵件證書(shū)

  個(gè)人安全電子郵件證書(shū)可以確保郵件的真實(shí)性和保密性。申請(qǐng)后一般是安裝在用戶的瀏覽器里。用戶可以利用它來(lái)發(fā)送簽名或加密的電子郵件。

  用戶在申請(qǐng)安裝完安全安全電子郵件數(shù)字證書(shū)后,就可以對(duì)要發(fā)送的郵件進(jìn)行數(shù)字簽名。收信人收到該郵件后,就可以看到數(shù)字簽名的標(biāo)記,這樣就可以證明郵件肯定來(lái)自發(fā)信者本人,而不是別人盜用該帳號(hào)偽造信件,同時(shí)也保證該郵件在傳送過(guò)程中沒(méi)被他人篡改過(guò)任何數(shù)據(jù)。

  安全電子郵件中使用的數(shù)字證書(shū)可以實(shí)現(xiàn):

  保密性 通過(guò)使用收件人的數(shù)字證書(shū)對(duì)電子郵件加密。如此以來(lái),只有收件人才能閱讀加密的郵件,在internet上傳遞的電子郵件信息不會(huì)被人竊取,即使發(fā)錯(cuò)郵件,收件人也無(wú)法看到郵件內(nèi)容。

  認(rèn)證身份 在internet上傳遞電子郵件的雙方互相不能見(jiàn)面,所以必須有方法確定對(duì)方的身份。利用發(fā)件人數(shù)字證書(shū)在傳送前對(duì)電子郵件進(jìn)行數(shù)字簽名即可確定發(fā)件人身份,而不是他人冒充的。

  完整性 利用發(fā)件人數(shù)字證書(shū)在傳送前對(duì)電子郵件進(jìn)行數(shù)字簽名不僅可確定發(fā)件人身份,而且傳遞的電子郵件信息也不能被人在傳輸過(guò)程中修改。

  不可否認(rèn)性 由于發(fā)件人的數(shù)字證書(shū)只有發(fā)件人唯一擁有,故發(fā)件人利用其數(shù)字證書(shū)在傳送前對(duì)電子郵件進(jìn)行數(shù)字簽名,發(fā)件人就無(wú)法否認(rèn)發(fā)過(guò)這個(gè)電子郵件。

  outlook express中的個(gè)人安全電子郵件證書(shū)

  簽名郵件帶有簽名郵件圖標(biāo)。

  簽名郵件可能出現(xiàn)的任何問(wèn)題都將在本信息之后可能出現(xiàn)的“安全警告”中得到描述。如果存在問(wèn)題,您應(yīng)該認(rèn)為郵件已被篡改,或并非來(lái)自所謂的發(fā)件人。

  當(dāng)收到一封加密郵件時(shí),您應(yīng)該可以自信地認(rèn)為郵件未被任何第三者讀過(guò)。outlook express 會(huì)自動(dòng)對(duì)電子郵件解密, 如果在您的計(jì)算機(jī)上裝有正確的數(shù)字標(biāo)識(shí)。

  2)企業(yè)數(shù)字證書(shū)

  a.企業(yè)身份證書(shū)

  企業(yè)身份證書(shū)是用來(lái)表明和驗(yàn)證企業(yè)用戶在網(wǎng)絡(luò)上身份的證書(shū),它確保了企業(yè)網(wǎng)上交易和作業(yè)的安全性和可靠性??蓱?yīng)用于:網(wǎng)上證券、網(wǎng)上辦公、網(wǎng)上交稅、網(wǎng)上采購(gòu)、網(wǎng)上資金轉(zhuǎn)帳、網(wǎng)上銀行等。企業(yè)身份證書(shū)可以存儲(chǔ)在軟盤(pán)和ic卡中。

  b.企業(yè)安全電子郵件證書(shū)

  企業(yè)安全電子郵件證書(shū)可以確保郵件的真實(shí)性和保密性。申請(qǐng)后一般是安裝在用戶的瀏覽器里。企業(yè)可以利用它來(lái)發(fā)送簽名或加密的電子郵件。

  可使用 windows XX 中的證書(shū)服務(wù)來(lái)創(chuàng)建證書(shū)頒發(fā)機(jī)構(gòu) (ca),它負(fù)責(zé)接收證書(shū)申請(qǐng)、驗(yàn)證申請(qǐng)中的信息和申請(qǐng)者的身份、頒發(fā)證書(shū)、吊銷證書(shū)以及發(fā)布證書(shū)吊銷列表 (crl)。

  通常,當(dāng)用戶發(fā)出證書(shū)申請(qǐng)時(shí),在其計(jì)算機(jī)上的加密服務(wù)提供程序 (csp) 為用戶生成公鑰和私鑰對(duì)。用戶的公鑰隨同必要的識(shí)別信息發(fā)送至 ca。如果用戶的識(shí)別信息符合批準(zhǔn)申請(qǐng)的 ca 標(biāo)準(zhǔn),那么 ca 將生成證書(shū),該證書(shū)由客戶應(yīng)用程序檢索并就地存儲(chǔ)。

  4.set

  安全接口層協(xié)議——ssl(se cure socketslayer),并且已經(jīng)幾乎成為了目前www 世界的事實(shí)標(biāo)準(zhǔn)。這一標(biāo)準(zhǔn)使用公共密鑰編碼方案來(lái)對(duì)傳輸數(shù)據(jù)進(jìn)行加密,在雙方之間建立一個(gè)internet 上的加密通道,從而使第三方無(wú)法獲得其中的信息,其思路與目前流行的方案大致相同,目的都是要保護(hù)數(shù)據(jù)不被未經(jīng)授權(quán)的第三方所竊聽(tīng),或即使竊聽(tīng)到也不知所云。但就象 一樣,ssl 在認(rèn)證方面沒(méi)有任何作為,它們都需要通過(guò)另外的手段來(lái)確認(rèn)身份和建立雙方彼此間的信任,然后再通過(guò)ssl 進(jìn)行交易。

  正是由于ssl 標(biāo)準(zhǔn)在認(rèn)證方面的缺憾,所以set 才有存在的必要。set(secure electronic transactions) 規(guī)范由masterc ard 和visa 公司于1996 年發(fā)布,專家們認(rèn)為set 是保證用戶與商家在電子商務(wù)與在線交易中免受欺騙的重要手段。傳統(tǒng)的信用卡交易者總在擔(dān)心不誠(chéng)實(shí)的店員會(huì)將自己的信用卡號(hào)碼透露給他人,而在線交易也是如此,持卡者總在擔(dān)心服務(wù)器端的管理員會(huì)將信用卡號(hào)碼泄露出去,或者擔(dān)心黑客會(huì)在管理員不知情的情況下盜取信用卡號(hào)碼。事實(shí)上這些擔(dān)心都是必要的,而set 標(biāo)準(zhǔn)則可以保證用戶的信用卡號(hào)碼只傳送給信用卡公司進(jìn)行認(rèn)證,不會(huì)被系統(tǒng)管理員看到,也不會(huì)留在交易服務(wù)器的硬盤(pán)上給黑客以可乘之機(jī)。

  5.pki

  pki是一種易于管理的、集中化的網(wǎng)絡(luò)安全方案。它可支持多種形式的數(shù)字認(rèn)證: 數(shù)據(jù)加密、數(shù)字簽字、不可否認(rèn)、身份鑒別、密鑰管理以及交叉認(rèn)證等。pki可通過(guò)一個(gè)基于認(rèn)證的框架處理所有的數(shù)據(jù)加密和數(shù)字簽字工作。p ki標(biāo)準(zhǔn)與協(xié)議的開(kāi)發(fā)迄今已有15年的歷史,目前的pki已完全可以向企業(yè)網(wǎng)絡(luò)提供有效的安全保障。 〖5〗〖6〗〖7〗〖8〗〖9〗〖10〗〖11〗〖12〗〖13〗〖14〗〖15〗

  pki是一種遵循標(biāo)準(zhǔn)的密鑰管理平臺(tái),它能夠?yàn)樗芯W(wǎng)絡(luò)應(yīng)用透明地提供采用加密和數(shù)字簽名等密碼服務(wù)所必需的密鑰和證書(shū)管理。pki必須具有

  1)ca、

  2)證書(shū)庫(kù)、

  3)密鑰備份及恢復(fù)系統(tǒng)、

  4)證書(shū)作廢處理系統(tǒng)、

  5)客戶端證書(shū)處理系統(tǒng)

  等基本成分,構(gòu)建pki也將圍繞著這五大系統(tǒng)來(lái)構(gòu)建

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

  1)為數(shù)據(jù)加密

  2)創(chuàng)建數(shù)字認(rèn)證。

  服務(wù)器(即后端)產(chǎn)品是這一系統(tǒng)的核心,這些數(shù)據(jù)庫(kù)管理著數(shù)字認(rèn)證、公共密鑰及專用密鑰( 分別用于數(shù)據(jù)的加密和解密)。

  ca數(shù)據(jù)庫(kù)負(fù)責(zé)發(fā)布、廢除和修改x.509數(shù)字認(rèn)證信息,它裝有用戶的公共密鑰、證書(shū)有效期以及認(rèn)證功能(例如對(duì)數(shù)據(jù)的加密或?qū)?shù)字簽字的驗(yàn)證) 。為了防止對(duì)數(shù)據(jù)簽字的篡改,ca在把每一數(shù)字簽字發(fā)送給發(fā)出請(qǐng)求的客戶機(jī)之前,需對(duì)每一個(gè)數(shù)字簽字進(jìn)行認(rèn)證。一旦數(shù)字認(rèn)證得以創(chuàng)建, 它將會(huì)被自動(dòng)存儲(chǔ)于x.500目錄中,x.500目錄為樹(shù)形結(jié)構(gòu)。ldap(lightweight directory access protocol)協(xié)議將響應(yīng)那些要求提交所存儲(chǔ)的公共密鑰認(rèn)證的請(qǐng)求。ca為每一用戶或服務(wù)器生成兩對(duì)獨(dú)立的公共和專用密鑰。其中一對(duì)用于信息的加密和解密, 另一對(duì)由客戶機(jī)應(yīng)用程序使用,用于文檔或信息傳輸中數(shù)字簽字的創(chuàng)建。

  大多數(shù)pki均支持證書(shū)分布,這是一個(gè)把已發(fā)布過(guò)的或續(xù)延生命期的證書(shū)加以存儲(chǔ)的過(guò)程。這一過(guò)程使用了一個(gè)公共查詢機(jī)制,x.500目錄可自動(dòng)完成這一存儲(chǔ)過(guò)程。影響企業(yè)普遍接受p ki的一大障礙是不同ca之間的交叉認(rèn)證。假設(shè)有兩家公司,每一家企業(yè)分別使用來(lái)自不同供應(yīng)商的ca,現(xiàn)在它們希望相互托管一段時(shí)間。如果其后援?dāng)?shù)據(jù)庫(kù)支持交叉認(rèn)證, 則這兩家企業(yè)顯然可以互相托管它們的ca,因而它們所托管的所有用戶均可由兩家企業(yè)的ca所托管。

  * 認(rèn)證機(jī)關(guān)

  ca是證書(shū)的簽發(fā)機(jī)構(gòu),它是pki的核心。眾所周知,構(gòu)建密碼服務(wù)系統(tǒng)的核心內(nèi)容是如何實(shí)現(xiàn)密鑰管理,公鑰體制涉及到一對(duì)密鑰,即私鑰和公鑰, 私鑰只由持有者秘密掌握,無(wú)須在網(wǎng)上傳送,而公鑰是公開(kāi)的,需要在網(wǎng)上傳送,故公鑰體制的密鑰管理主要是公鑰的管理問(wèn)題,目前較好的解決方案是引進(jìn)證書(shū)(certificate)機(jī)制。

  證書(shū)是公開(kāi)密鑰體制的一種密鑰管理媒介。它是一種權(quán)威性的電子文檔,形同網(wǎng)絡(luò)計(jì)算環(huán)境中的一種身份證,用于證明某一主體(如人、服務(wù)器等)的身份以及其公開(kāi)密鑰的合法性。在使用公鑰體制的網(wǎng)絡(luò)環(huán)境中, 必須向公鑰的使用者證明公鑰的真實(shí)合法性。因此,在公鑰體制環(huán)境中,必須有一個(gè)可信的機(jī)構(gòu)來(lái)對(duì)任何一個(gè)主體的公鑰進(jìn)行公證,證明主體的身份以及他與公鑰的匹配關(guān)系。c a正是這樣的機(jī)構(gòu),它的職責(zé)歸納起來(lái)有:

  1、驗(yàn)證并標(biāo)識(shí)證書(shū)申請(qǐng)者的身份;

  2、確保ca用于簽名證書(shū)的非對(duì)稱密鑰的質(zhì)量;

  3、確保整個(gè)簽證過(guò)程的安全性,確保簽名私鑰的安全性;

  4、證書(shū)材料信息(包括公鑰證書(shū)序列號(hào)、ca標(biāo)識(shí)等)的管理;

  5、確定并檢查證書(shū)的有效期限;

  6、確保證書(shū)主體標(biāo)識(shí)的唯一性,防止重名;

  7、發(fā)布并維護(hù)作廢證書(shū)表;

  8、對(duì)整個(gè)證書(shū)簽發(fā)過(guò)程做日志記錄;

  9、向申請(qǐng)人發(fā)通知。

  其中最為重要的是ca自己的一對(duì)密鑰的管理,它必須確保其高度的機(jī)密性,防止他方偽造證書(shū)。ca的公鑰在網(wǎng)上公開(kāi),整個(gè)網(wǎng)絡(luò)系統(tǒng)必須保證完整性。

  * 證書(shū)庫(kù)

  證書(shū)庫(kù)是證書(shū)的集中存放地,它與網(wǎng)上"白頁(yè)”類似,是網(wǎng)上的一種公共信息庫(kù),用戶可以從此處獲得其他用戶的證書(shū)和公鑰。

  構(gòu)造證書(shū)庫(kù)的最佳方法是采用支持ldap協(xié)議的目錄系統(tǒng),用戶或相關(guān)的應(yīng)用通過(guò)ldap來(lái)訪問(wèn)證書(shū)庫(kù)。系統(tǒng)必須確保證書(shū)庫(kù)的完整性,防止偽造、篡改證書(shū)。

  * 密鑰備份及恢復(fù)系統(tǒng)

  * 證書(shū)作廢處理系統(tǒng)

  * pki應(yīng)用接口系統(tǒng)

  pki的價(jià)值在于使用戶能夠方便地使用加密、數(shù)字簽名等安全服務(wù),因此一個(gè)完整的pki必須提供良好的應(yīng)用接口系統(tǒng),使得各種各樣的應(yīng)用能夠以安全、一致、可信的方式與p ki交互,確保所建立起來(lái)的網(wǎng)絡(luò)環(huán)境的可信性,同時(shí)降低管理維護(hù)成本。最后,pki應(yīng)用接口系統(tǒng)應(yīng)該是跨平臺(tái)的。

  許多權(quán)威的認(rèn)證方案供應(yīng)商(例如verisign、thawte以及gte)目前都在提供外包的pki。外包pki最大的問(wèn)題是,用戶必須把企業(yè)托管給某一服務(wù)提供商, 即讓出對(duì)網(wǎng)絡(luò)安全的控制權(quán)。如果不愿這樣做,則可建造一個(gè)專用的pki。專用方案通常需把來(lái)自entrust、baltimore technologies以及xcert的多種服務(wù)器產(chǎn)品與來(lái)自主流應(yīng)用程序供應(yīng)商(如microsoft、netscape以及qualcomm)的產(chǎn)品組合在一起。專用pk i還要求企業(yè)在準(zhǔn)備其基礎(chǔ)設(shè)施的過(guò)程中投入大量的財(cái)力與物力。

  7.jaas

  擴(kuò)展jaas實(shí)現(xiàn)類實(shí)例級(jí)授權(quán)

  “java 認(rèn)證和授權(quán)服務(wù)”(java authentication and authorization service,jaas)

  在 jaas 下,可以給予用戶或服務(wù)特定的許可權(quán)來(lái)執(zhí)行 java 類中的代碼。在本文中,軟件工程師 carlos fonseca 向您展示如何為企業(yè)擴(kuò)展 jaas 框架。向 jaas 框架添加類實(shí)例級(jí)授權(quán)和特定關(guān)系使您能夠構(gòu)建更動(dòng)態(tài)、更靈活并且伸縮性更好的企業(yè)應(yīng)用程序。

  大多數(shù) java 應(yīng)用程序都需要某種類實(shí)例級(jí)的訪問(wèn)控制。例如,基于 web 的、自我服務(wù)的拍賣應(yīng)用程序的規(guī)范可能有下列要求: 《5》《6》《7》《8》《9》《10》《11》《12》《13》《14》《15》

  任何已注冊(cè)(經(jīng)過(guò)認(rèn)證)的用戶都可以創(chuàng)建一個(gè)拍賣,但只有創(chuàng)建拍賣的用戶才可以修改這個(gè)拍賣。

  這意味著任何用戶都可以執(zhí)行被編寫(xiě)用來(lái)創(chuàng)建 auction 類實(shí)例的代碼,但只有擁有該實(shí)例的用戶可以執(zhí)行用來(lái)修改它的代碼。通常情況下,創(chuàng)建 auction 實(shí)例的用戶就是所有者。這被稱為類實(shí)例所有者關(guān)系(class instance owner relationship)。

  該應(yīng)用程序的另一個(gè)要求可能是:

  任何用戶都可以為拍賣創(chuàng)建一個(gè)投標(biāo),拍賣的所有者可以接受或拒絕任何投標(biāo)。

  再一次,任何用戶都可以執(zhí)行被編寫(xiě)用來(lái)創(chuàng)建 bid 類實(shí)例的代碼,但只有擁有該實(shí)例的用戶會(huì)被授予修改該實(shí)例的許可權(quán)。而且,auction 類實(shí)例的所有者必須能夠修改相關(guān)的 bid 類實(shí)例中的接受標(biāo)志。這意味著在 auction 實(shí)例和相應(yīng)的 bid 實(shí)例之間有一種被稱為特定關(guān)系(special relationship)的關(guān)系。

  不幸的是,“java 認(rèn)證和授權(quán)服務(wù)”(jaas)— 它是 java 2 平臺(tái)的一部分 — 沒(méi)有考慮到類實(shí)例級(jí)訪問(wèn)控制或者特定關(guān)系。在本文中,我們將擴(kuò)展 jaas 框架使其同時(shí)包含這兩者。推動(dòng)這種擴(kuò)展的動(dòng)力是允許我們將訪問(wèn)控制分離到一個(gè)通用的框架,該框架使用基于所有權(quán)和特定關(guān)系的策略。然后管理員可以在應(yīng)用程序的生命周期內(nèi)更改這些策略。

  在深入到擴(kuò)展 jaas 框架之前,我們將重溫一下 java 2 平臺(tái)的訪問(wèn)控制機(jī)制。我們將討論策略文件和許可權(quán)的使用,并討論 securitymanager 和 accesscontroller 之間的關(guān)系。

  java 2 平臺(tái)中的訪問(wèn)控制

  在 java 2 平臺(tái)中,所有的代碼,不管它是本地代碼還是遠(yuǎn)程代碼,都可以由策略來(lái)控制。策略(policy)由不同位置上的代碼的一組許可權(quán)定義,或者由不同的簽發(fā)者定義、或者由這兩者定義。許可權(quán)允許對(duì)資源進(jìn)行訪問(wèn);它通過(guò)名稱來(lái)定義,并且可能與某些操作關(guān)聯(lián)在一起。

  抽象類 java.security.policy 被用于表示應(yīng)用程序的安全性策略。缺省的實(shí)現(xiàn)由 sun.security.provider.policyfile 提供,在 sun.security.provider.policyfile 中,策略被定義在一個(gè)文件中。清單 1 是一個(gè)典型策略文件示例:

  清單 1. 一個(gè)典型的策略文件

  // grant these permissions to code loaded from a sample.jar file

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

  grant codebase "file:/c:/sample.jar", signedby "xyz" {

  // allow socket actions to any host using port 8080

  permission java.net.socketpermission "*:8080", "accept, connect,

  listen, resolve";

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

  // the user's home directory.

  permission java.io.filepermission "${user.home}/-", "read, write,

  execute, delete";

  };

  securitymanager 對(duì) accesscontroller

  在標(biāo)準(zhǔn) jdk 分發(fā)版中,控制代碼源訪問(wèn)的機(jī)制缺省情況下是關(guān)閉的。在 java 2 平臺(tái)以前,對(duì)代碼源的訪問(wèn)都是由 securitymanager 類管理的。securitymanager 是由 java.security.manager 系統(tǒng)屬性啟動(dòng)的,如下所示:

  java -djava.security.manager

  在 java 2 平臺(tái)中,可以將一個(gè)應(yīng)用程序設(shè)置為使用 java.lang.securitymanager 類或者 java.security.accesscontroller 類管理敏感的操作。accesscontroller 在 java 2 平臺(tái)中是新出現(xiàn)的。為便于向后兼容,securitymanager 類仍然存在,但把自己的決定提交 accesscontroller 類裁決。securitymanager 和 accesscontroller 都使用應(yīng)用程序的策略文件確定是否允許一個(gè)被請(qǐng)求的操作。清單 2 顯示了 accesscontroller 如何處理 socketpermission 請(qǐng)求:

  清單 2. 保護(hù)敏感操作

  public void somemethod() {

  permission permission =

  new java.net.socketpermission("localhost:8080", "connect");

  accesscontroller.checkpermission(permission);

  // sensitive code starts here

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

  }

  在這個(gè)示例中,我們看到 accesscontroller 檢查應(yīng)用程序的當(dāng)前策略實(shí)現(xiàn)。如果策略文件中定義的任何許可權(quán)暗示了被請(qǐng)求的許可權(quán),該方法將只簡(jiǎn)單地返回;否則拋出一個(gè) accesscontrolexception 異常。在這個(gè)示例中,檢查實(shí)際上是多余的,因?yàn)槿笔√捉幼謱?shí)現(xiàn)的構(gòu)造函數(shù)也執(zhí)行相同的檢查。

  在下一部分,我們將更仔細(xì)地看一下 accesscontroller 如何與 java.security.policy 實(shí)現(xiàn)共同合作安全地處理應(yīng)用程序請(qǐng)求。

  運(yùn)行中的 accesscontroller

  accesscontroller 類典型的 checkpermission(permission p) 方法調(diào)用可能會(huì)導(dǎo)致下面的一系列操作:

  accesscontroller 調(diào)用 java.security.policy 類實(shí)現(xiàn)的 getpermissions(codesource codesource) 方法。

  getpermissions(codesource codesource) 方法返回一個(gè) permissioncollection 類實(shí)例,這個(gè)類實(shí)例代表一個(gè)相同類型許可權(quán)的集合。

  accesscontroller 調(diào)用 permissioncollection 類的 implies(permission p) 方法。

  接下來(lái),permissioncollection 調(diào)用集合中包含的單個(gè) permission 對(duì)象的 implies(permission p) 方法。如果集合中的當(dāng)前許可權(quán)對(duì)象暗示指定的許可權(quán),則這些方法返回 true,否則返回 false。

  [1][2][3][4][5][6][7][8][9][10][11][12][13][14][15]

  現(xiàn)在,讓我們更詳細(xì)地看一下這個(gè)訪問(wèn)控制序列中的重要元素。

  permissioncollection 類

  大多數(shù)許可權(quán)類類型都有一個(gè)相應(yīng)的 permissioncollection 類。這樣一個(gè)集合的實(shí)例可以通過(guò)調(diào)用 permission 子類實(shí)現(xiàn)定義的 newpermissioncollection() 方法來(lái)創(chuàng)建。java.security.policy 類實(shí)現(xiàn)的 getpermissions() 方法也可以返回 permissions 類實(shí)例 — permissioncollection 的一個(gè)子類。這個(gè)類代表由 permissioncollection 組織的不同類型許可權(quán)對(duì)象的一個(gè)集合。permissions 類的 implies(permission p) 方法可以調(diào)用單個(gè) permissioncollection 類的 implies(permission p) 方法。

  codesource 和 protectiondomain 類

  許可權(quán)組合與 codesource(被用于驗(yàn)證簽碼(signed code)的代碼位置和證書(shū))被封裝在 protectiondomain 類中。有相同許可權(quán)和相同 codesource 的類實(shí)例被放在相同的域中。帶有相同許可權(quán),但不同 codesource 的類被放在不同的域中。一個(gè)類只可屬于一個(gè) protectiondomain。要為對(duì)象獲取 protectiondomain,請(qǐng)使用 java.lang.class 類中定義的 getprotectiondomain() 方法。

  許可權(quán)

  賦予 codesource 許可權(quán)并不一定意味著允許所暗示的操作。要使操作成功完成,調(diào)用棧中的每個(gè)類必須有必需的許可權(quán)。換句話說(shuō),如果您將 java.io.filepermission 賦給類 b,而類 b 是由類 a 來(lái)調(diào)用,那么類 a 必須也有相同的許可權(quán)或者暗示 java.io.filepermission 的許可權(quán)。

  在另一方面,調(diào)用類可能需要臨時(shí)許可權(quán)來(lái)完成另一個(gè)擁有那些許可權(quán)的類中的操作。例如,當(dāng)從另一個(gè)位置加載的類訪問(wèn)本地文件系統(tǒng)時(shí),我們可能不信任它。但是,本地加載的類被授予對(duì)某個(gè)目錄的讀許可權(quán)。這些類可以實(shí)現(xiàn) privilegedaction 接口來(lái)給予調(diào)用類許可權(quán)以便完成指定的操作。調(diào)用棧的檢查在遇到 privilegedaction 實(shí)例時(shí)停止,有效地將執(zhí)行指定操作所必需的許可權(quán)授予所有的后繼類調(diào)用。

  使用 jaas

  顧名思義,jaas 由兩個(gè)主要組件組成:認(rèn)證和授權(quán)。我們主要關(guān)注擴(kuò)展 jaas 的授權(quán)組件,但開(kāi)始我們先簡(jiǎn)要概述一下 jaas 認(rèn)證,緊接著看一下一個(gè)簡(jiǎn)單的 jaas 授權(quán)操作。

  jaas 中的用戶認(rèn)證

  jaas 通過(guò)添加基于 subject 的策略加強(qiáng)了 java 2 中定義的訪問(wèn)控制安全性模型。許可權(quán)的授予不僅基于 codesource,還基于執(zhí)行代碼的用戶。顯然,要使這個(gè)模型生效,每個(gè)用戶都必須經(jīng)過(guò)認(rèn)證。

  jaas 的認(rèn)證機(jī)制建立在一組可插登錄模塊的基礎(chǔ)上。jaas 分發(fā)版包含幾個(gè) loginmodule 實(shí)現(xiàn)。loginmodules 可以用于提示用戶輸入用戶標(biāo)識(shí)和密碼。logincontext 類使用一個(gè)配置文件來(lái)確定使用哪個(gè) loginmodule 對(duì)用戶進(jìn)行認(rèn)證。這個(gè)配置可以通過(guò)系統(tǒng)屬性 java.security.auth.login.config 指定。一個(gè)示例配置是:

  java -djava.security.auth.login.config=login.conf

  下面是一個(gè)登錄配置文件的樣子:

  example {

  com.ibm.resource.security.auth.loginmoduleexample required

  debug=true userfile="users.xml" groupfile="groups.xml";

  };

  認(rèn)識(shí)您的主體

  subject 類被用于封裝一個(gè)被認(rèn)證實(shí)體(比如用戶)的憑證。一個(gè) subject 可能擁有一個(gè)被稱為主體(principal)的身份分組。例如,如果 subject 是一個(gè)用戶,用戶的名字和相關(guān)的社會(huì)保險(xiǎn)號(hào)可能是 subject 的某些身份或主體。主體是與身份名關(guān)聯(lián)在一起的。

  principal 實(shí)現(xiàn)類及其名稱都是在 jaas 策略文件中指定的。缺省的 jaas 實(shí)現(xiàn)使用的策略文件與 java 2 實(shí)現(xiàn)的策略文件相似 — 除了每個(gè)授權(quán)語(yǔ)句必須與至少一個(gè)主體關(guān)聯(lián)在一起。javax.security.auth.policy 抽象類被用于表示 jaas 安全性策略。它的缺省實(shí)現(xiàn)由 com.sun.security.auth.policyfile 提供,在 com.sun.security.auth.policyfile 中策略定義在一個(gè)文件中。清單 3 是 jaas 策略文件的一個(gè)示例:

  清單 3. 示例 jaas 策略文件

  // example grant entry

  grant codebase "file:/c:/sample.jar", signedby "xyz",

  principal com.ibm.resource.security.auth.principalexample "admin" {

  // allow socket actions to any host using port 8080

  permission java.net.socketpermission

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

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

  // the user's home directory.

  permission java.io.filepermission

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

  };

  這個(gè)示例與清單 1 中所示的標(biāo)準(zhǔn) java 2 策略文件相似。實(shí)際上,唯一的不同是主體語(yǔ)句,該語(yǔ)句聲明只有擁有指定主體和主體名字的 subject(用戶)被授予指定的許可權(quán)。

  再一次,使用系統(tǒng)屬性 java.security.auth.policy 指出 jaas 策略文件駐留在何處,如下所示:

  java -djava.security.auth.policy=policy.jaas

  subject 類包含幾個(gè)方法來(lái)作為特殊 subject 執(zhí)行工作;這些方法如下所示:

  public static object

  doas(subject subject, java.security.privilegedaction action) 3 4 5 6 7 8 9 10 11 12 13 14 15

  public static object

  doas(subject subject, java.security.privilegedaction action)

  throws java.security.privilegedactionexception

  注意,用來(lái)保護(hù)敏感代碼的方法與“java 2 代碼源訪問(wèn)控制”(java 2 codesource access control)概述中描述的方法相同。請(qǐng)參閱參考資料部分以了解更多關(guān)于 jaas 中代碼源訪問(wèn)控制和認(rèn)證的信息。

  jaas 中的授權(quán)

  清單 4 顯示一個(gè)授權(quán)請(qǐng)求的結(jié)果,該請(qǐng)求使用清單 3 中顯示的 jaas 策略文件。假設(shè)已經(jīng)安裝了 securitymanager,并且 logincontext 已經(jīng)認(rèn)證了一個(gè)帶有名為“admin”的 com.ibm.resource.security.auth.principalexample 主體的 subject。

  清單 4. 一個(gè)簡(jiǎn)單的授權(quán)請(qǐng)求

  public class jaasexample {

  public static void main(string[] args) {

  ...

  // where authenticateduser is a subject with

  // a principalexample named admin.

  subject.doas(authenticateduser, new jaasexampleaction());

  ...

  }

  }

  public class jaasexampleaction implements privilegedaction {

  public object run() {

  filewriter fw = new filewriter("hi.txt");

  fw.write("hello, world!");

  fw.close();

  }

  }

  這里,敏感代碼被封裝在 jaasexampleaction 類中。還要注意,調(diào)用類不要求為 jaasexampleaction 類代碼源授予許可權(quán),因?yàn)樗鼘?shí)現(xiàn)了一個(gè) privilegedaction。

  擴(kuò)展 jaas

  大多數(shù)應(yīng)用程序都有定制邏輯,它授權(quán)用戶不僅僅在類上執(zhí)行操作,而且還在該類的實(shí)例上執(zhí)行操作。這種授權(quán)通常建立在用戶和實(shí)例之間的關(guān)系上。這是 jaas 的一個(gè)小缺點(diǎn)。然而,幸運(yùn)的是,這樣設(shè)計(jì) jaas 使得 jaas 可以擴(kuò)展。只要做一點(diǎn)工作,我們將可以擴(kuò)展 jaas,使其包含一個(gè)通用的、類實(shí)例級(jí)的授權(quán)框架。

  在文章開(kāi)頭處我已經(jīng)說(shuō)明了,抽象類 javax.security.auth.policy 被用于代表 jaas 安全性策略。它的缺省實(shí)現(xiàn)是由 com.sun.security.auth.policyfile 類提供。policyfile 類從 jaas 格式的文件(象清單 3 中顯示的那個(gè)一樣)中讀取策略。

  我們需要向這個(gè)文件添加一個(gè)東西為類實(shí)例級(jí)授權(quán)擴(kuò)展策略定義:一個(gè)與許可權(quán)語(yǔ)句相關(guān)的可選關(guān)系參數(shù)。

  缺省 jaas 許可權(quán)語(yǔ)句的格式如下:

  permission ; [name], [actions];

  我們?cè)谶@個(gè)許可權(quán)語(yǔ)句的末尾添加一個(gè)可選的關(guān)系參數(shù)來(lái)完成策略定義。下面是新許可權(quán)語(yǔ)句的格式:

  permission ;

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

  在為類實(shí)例級(jí)授權(quán)擴(kuò)展 jaas 時(shí)要注意的最重要的一點(diǎn)是:許可權(quán)實(shí)現(xiàn)類必須有一個(gè)帶三個(gè)參數(shù)的構(gòu)造函數(shù)。第一個(gè)參數(shù)是名稱參數(shù),第二個(gè)是行為參數(shù),最后一個(gè)是關(guān)系參數(shù)。

  解析新文件格式

  既然文件格式已經(jīng)改變,就需要一個(gè)新的 javax.security.auth.policy 子類來(lái)解析文件。

  為簡(jiǎn)單起見(jiàn),我們的示例使用了一個(gè)新的 javax.security.auth.policy 子類 com.ibm.resource.security.auth.xmlpolicyfile,來(lái)從 xml 文件讀取策略。在實(shí)際的企業(yè)應(yīng)用程序中,關(guān)系數(shù)據(jù)庫(kù)更適合執(zhí)行這個(gè)任務(wù)。

  使用 xmlpolicyfile 類代替缺省的 jaas 訪問(wèn)控制策略實(shí)現(xiàn)的最容易的方法是向 java.security 屬性文件添加 auth.policy.provider=com.ibm.resource.security.auth.xmlpolicyfile 條目。java.security 屬性文件位于 java 2 平臺(tái)運(yùn)行時(shí)的 lib/security 目錄下。清單 5 是與 xmlpolicyfile 類一起使用的樣本 xml 策略文件:

  清單 5. 一個(gè) xml 策略文件

  ;

  ;

  ;

  "com.ibm.resource.security.auth.principalexample" name="users">;

  "com.ibm.resource.security.auth.resourcepermission"

  name="com.ibm.security.sample.auction"

  actions="create" />;

  "com.ibm.resource.security.auth.resourcepermission"

  name="com.ibm.security.sample.auction"

  actions="read" />;

  "com.ibm.resource.security.auth.resourcepermission"

  name="com.ibm.security.sample.auction"

  actions="write"

  relationship="owner" />;

  "com.ibm.resource.security.auth.resourcepermission"

  name="com.ibm.security.sample.bid"

  actions="create" />;

  "com.ibm.resource.security.auth.resourcepermission"

  name="com.ibm.security.sample.bid"

  actions="read" />;

  "com.ibm.resource.security.auth.resourcepermission"

  【5】【6】【7】【8】【9】【10】【11】【12】【13】【14】【15】

  name="com.ibm.security.sample.bid"

  actions="write"

  relationship="owner" />;

  "com.ibm.resource.security.auth.resourcepermission"

  name="com.ibm.security.sample.bid"

  actions="accept"

  relationship="actionowner" />;

  ;

  ;

  ;

  在這個(gè)示例策略文件中,任何與名為 principalexample 的用戶有關(guān)的用戶(subject)都可以創(chuàng)建并讀取一個(gè) auction.class 實(shí)例。但是,只有創(chuàng)建該實(shí)例的用戶才可以更新(寫(xiě))它。這是第三個(gè) permission 元素定義的,該元素包含值為 owner 的 relationship 屬性。bid.class 實(shí)例也是一樣,除了相應(yīng) auction.class 實(shí)例的所有者可以更改投標(biāo)接受標(biāo)志。

  resource 接口

  要求類實(shí)例級(jí)訪問(wèn)控制的類必須實(shí)現(xiàn) resource 接口。該接口的 getowner() 方法返回類實(shí)例的所有者。fulfills(subject subject, string relationship) 方法被用于處理特定關(guān)系。另外,這些類使用 com.ibm.resource.security.auth.resourcepermission 類保護(hù)敏感代碼。例如,auction 類擁有下列構(gòu)造函數(shù):

  public auction() {

  permission permission =

  new resourcepermission("com.ibm.security.sample.auction", "create");

  accesscontroller.checkpermission(permission);

  }

  所有者關(guān)系

  resourcepermission 類的 implies(permission p) 方法是這個(gè)框架的關(guān)鍵。implies() 方法就等同性比較名稱和行為屬性。如果定義了一個(gè)關(guān)系,那么必須把受保護(hù)的類實(shí)例(resource)傳遞到 resourcepermission 構(gòu)造函數(shù)中。resourcepermission 類理解所有者關(guān)系。它將類實(shí)例的所有者與執(zhí)行代碼的 subject(用戶)進(jìn)行比較。特定關(guān)系被委托給受保護(hù)類的 fulfills() 方法。

  例如,在清單 5 中所示的 xml 策略文件中,只有 auction 類實(shí)例的所有者可以更新(寫(xiě))文件。該類的 setter 方法使用清單 6 中顯示的保護(hù)代碼:

  清單 6. 運(yùn)行中的 implies(permission) 方法

  public void setname(string newname) {

  permission permission =

  new resourcepermission("com.ibm.security.sample.auction", "write", this);

  accesscontroller.checkpermission(permission);

  // sensitive code

  this.name = newname;

  }

  被傳遞到 resourcepermission 構(gòu)造函數(shù)中的 this 引用代表 auction 類實(shí)現(xiàn)的 resource 接口。由于策略文件中列出的關(guān)系是 owner,所以 resourcepermission 類使用這個(gè)引用檢查當(dāng)前 subject(用戶)是否擁有與實(shí)例所有者相匹配的主體。如果指定了另一個(gè)關(guān)系,那么 resourcepermission 類調(diào)用 auction 類的 fulfills(subject subject, string relationship) 方法。由 resource 實(shí)現(xiàn)類提供 fulfills() 方法中的邏輯。

  xml 策略文件中列出的 bid 類擁有清單 7 中所示的方法(假設(shè) bid 類實(shí)例有一個(gè)對(duì)相應(yīng) auction 類實(shí)例的引用 — auction)。

  清單 7. 處理特定關(guān)系

  public void setaccepted(boolean flag) {

  permission permission =

  new resourcepermission("com.ibm.security.sample.auction", "accept", this);

  accesscontroller.checkpermission(permission);

  // sensitive code

  this.accepted = flag;

  }

  public boolean fulfills(subject user, string relationship) {

  if( relationship.equalsignorecase("auctionowner") ) {

  string auctionowner = auction.getowner();

  iterator principaliterator = user.getprincipals().iterator();

  while(principaliterator.hasnext()) {

  principal principal = (principal) principaliterator.next();

  if( principal.getname().equals(auctionowner) )

  return true;

  }

  }

  return false;

  }

  傳遞到 fulfills() 方法中的關(guān)系字符串是策略文件中列出的關(guān)系。在這個(gè)案例中,我們使用了“auctionowner”字符串。

  缺省情況下,xmlpolicyfile 類在當(dāng)前工作目錄中查找名為 resourcepolicy.xml 的文件。系統(tǒng)屬性 com.ibm.resource.security.auth.policy 可以用于指定另一個(gè)不同的文件名和位置。

  websphere application server 示例

  除命令行示例之外,您可能還想運(yùn)行這個(gè)簡(jiǎn)單的程序,該程序?yàn)榱?ibm websphere application server,version 4.0.2 而被優(yōu)化。

  一個(gè)可運(yùn)行的示例

  綜合這些信息,我們將運(yùn)行一個(gè)簡(jiǎn)單的命令行示例。該示例程序包含三個(gè) jar 文件:

  resourcesecurity.jar

  example.jar

  exampleactions.jar

  resourcesecurity.jar 文件包含允許實(shí)例級(jí)訪問(wèn)控制的 jaas 擴(kuò)展框架。它還包含一個(gè) loginmoduleexample 類,這個(gè)類從 xml 文件讀取用戶認(rèn)證信息。用戶標(biāo)識(shí)和密碼存儲(chǔ)在 users.xml 文件中。用戶組存儲(chǔ)在 groups.xml 文件中。關(guān)于 loginmoduleexample 的更多信息,請(qǐng)參閱參考資料部分。

  該示例包含四個(gè)附加的文件:

  login.conf

  policy

  resourcepolicy.xml

  run.bat

  在試圖運(yùn)行這個(gè)示例程序之前,請(qǐng)確保更新了 run.bat、policy 和 resourcepolicy.xml 文件中的路徑。缺省情況下,所有的密碼都是“passw0rd”。

  示例如何工作

  該示例程序提示輸入用戶標(biāo)識(shí)和密碼。它用 users.xml 文件中的條目核對(duì)所提供的用戶標(biāo)識(shí)和密碼。在認(rèn)證了用戶之后,程序設(shè)法創(chuàng)建一個(gè) userprofile 類實(shí)例,修改它并從中讀取。缺省情況下,userprofile 類的所有者是 jane(jane)。當(dāng) jane 登錄時(shí),三個(gè)操作全部成功。當(dāng) john(john)登錄時(shí),只有創(chuàng)建操作成功。當(dāng) jane 的經(jīng)理 lou(lou)登錄時(shí),只有第一個(gè)和最后一個(gè)操作成功。當(dāng)系統(tǒng)管理員(admin)登錄時(shí),操作全部成功。當(dāng)然,只有當(dāng)提供的 resourcepolicy.xml 文件未被修改時(shí),上述這些才都是真的。

  示例安裝

  下面的安裝指導(dǎo)假設(shè)您正在使用 jdk 1.3 并且已經(jīng)把文件解壓縮到 d:\jaasexample 目錄。通過(guò)將文件解壓縮到這個(gè)目錄,您可以省去一些工作;否則您就必須使用正確的路徑名修改 policy 和 resourcesecurity.xml 策略文件。

  下面是運(yùn)行該示例需要做的工作:

  下載這個(gè)示例的源文件。

  把 jaas.jar 和 jaasmod.jar 復(fù)制到 jdk jre\lib\ext 目錄(即 d:\jdk1.3\jre\lib\ext)。

  向位于 jdk 的 jre\lib\security 目錄(即 d:\jdk1.3\jre\lib\security)中的 java.security 文件的末尾添加下面的字符串:auth.policy.provider=com.ibm.resource.security.auth.xmlpolicyfile。

  執(zhí)行 run.bat 文件。

  結(jié)束語(yǔ)

  類實(shí)例級(jí)授權(quán)把訪問(wèn)控制分離到一個(gè)通用框架(該框架使用基于所有權(quán)和特定關(guān)系的策略)中。然后管理員可以在應(yīng)用程序的生命周期內(nèi)更改這些策略。用這種方法擴(kuò)展 jaas 減少了您或另一個(gè)程序員必須在應(yīng)用程序生命周期內(nèi)業(yè)務(wù)規(guī)則發(fā)生更改時(shí)重寫(xiě)代碼的可能性。

  通過(guò)將關(guān)系字符串抽象為類可以進(jìn)一步擴(kuò)展特定關(guān)系這個(gè)概念。不調(diào)用 resource 實(shí)現(xiàn)類的 fulfills(subject user, string relationship) 方法,而只要調(diào)用 relationship 實(shí)現(xiàn)類中定義的新 fulfills(subject user, resource resource) 方法。這樣就會(huì)允許許多 resource 實(shí)現(xiàn)類使用相同的關(guān)系邏輯。

  6.java的安全性

  1. the security manager是一個(gè)application-wide object ( java.lang.securitymanager)

  每個(gè)java application都可以有自己地security manager,但是默認(rèn)地java application沒(méi)有一個(gè)security manager

  可以通過(guò)下面地代碼得到一個(gè)security manager

  try

  {

  system.setsecuritymanager(new securitymanager(“--”));

  }

  catch( )

  {}

  2.

  jdbc

  在 jdbc 2 開(kāi)發(fā)的過(guò)程中,sql99 還處在一種變化不定的情況下?,F(xiàn)在規(guī)范已經(jīng)完成了,而且數(shù)據(jù)庫(kù)廠商已經(jīng)采用了部分標(biāo)準(zhǔn)。所以自然地,jdbc 規(guī)范就跟著將自己與 sql99 功能的一部分相統(tǒng)一。最新的 jdbc 規(guī)范已經(jīng)采用了 sql99 標(biāo)準(zhǔn)中那些已經(jīng)被廣泛支持的功能,還有那些在五年內(nèi)可能會(huì)獲得支持的功能。

  1. datasource

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

  一旦配置了j2ee應(yīng)用服務(wù)器后,只要用datasource獲取連接(connection),連接池(connection pooling)就會(huì)自動(dòng)的工作。

  如果用戶希望建立一個(gè)數(shù)據(jù)庫(kù)連接,通過(guò)查詢?cè)趈ndi服務(wù)中的datasource,可以從datasource中獲取相應(yīng)的數(shù)據(jù)庫(kù)連接。

  datasource被認(rèn)為是從jndi中獲取的網(wǎng)絡(luò)資源。

  datasource在池中保存的對(duì)象都實(shí)現(xiàn)了pooledconnection接口。

  當(dāng)應(yīng)用程序向datasource請(qǐng)求一個(gè)connection時(shí),它會(huì)找到一個(gè)可用的pooledconnection對(duì)象。

  如果連接池空了,它就向connectionpoolecdatasource請(qǐng)求一個(gè)新的pooledconnection對(duì)象

  通過(guò)使用 datasource 接口 (jdbc 2.0) 或 drivermanager (jdbc 1.0) 接口,j2ee 組件可以獲得物理數(shù)據(jù)庫(kù)連接對(duì)象(connection)。要獲得邏輯(合用的)連接,j2ee 組件必須使用以下這些 jdbc 2.0 合用管理器接口:

  javax.sql.connectionpooldatasource 接口,該接口充當(dāng)合用的 java.sql.connection 對(duì)象的資源管理器連接 factory。每家數(shù)據(jù)庫(kù)服務(wù)器供應(yīng)商都提供該接口的實(shí)現(xiàn)

  (例如,oracle 實(shí)現(xiàn) oracle.jdbc.pool.oracleconnectionpooldatasource 類)。

  javax.sql.pooledconnection 接口,該接口封裝到數(shù)據(jù)庫(kù)的物理連接。同樣,數(shù)據(jù)庫(kù)供應(yīng)商提供其實(shí)現(xiàn)。

  對(duì)于那些接口和 xa 連接的每一個(gè),都存在一個(gè) xa(x/open 規(guī)范)等價(jià)定義。

  2. resultset

  在jdbc2.0中,為了獲得一個(gè)uptatable result,在query語(yǔ)句里必須包含primarykey,并且查詢的內(nèi)容里必須來(lái)自一個(gè)table

  ava.sql.resultset接口中定義了三種類型的結(jié)果集

  type_forward_only

  type_scroll_insensitive 這種類型的結(jié)果集支持雙向滾動(dòng)

  type_scroll_sensitive

  如果要建立一個(gè)雙向滾動(dòng)的resultset,一定要在建立statement的時(shí)候使用如下參數(shù)

  statement stmt = conn.createstatement(resultset.type_scroll_insensitive,

  resultset.concur_read_only);

  3. jdbc驅(qū)動(dòng)程序

  連通oracle8.1.6的jdbc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

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

  如果光copy不ren為.jar是沒(méi)有用的。

  4. 事務(wù)處理

  本地事務(wù)

  java.sql.connection接口可以控制事務(wù)邊界(即開(kāi)始和結(jié)束)。

  在事務(wù)開(kāi)始的時(shí)候調(diào)用setautocommit( false ), 而在中止事務(wù)時(shí)調(diào)用rollback或commit()方法。這類事務(wù)叫本地事務(wù)。

  分布式事務(wù)

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

  或者,客戶在同一個(gè)事務(wù)中可能會(huì)執(zhí)行跨越多個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)操作。

  jdbc2.0 optional package 同jta一起來(lái)實(shí)現(xiàn)分布式樣事務(wù)。

  5. 一些技巧

  檢索自動(dòng)產(chǎn)生的關(guān)鍵字

  為了解決對(duì)獲取自動(dòng)產(chǎn)生的或自動(dòng)增加的關(guān)鍵字的值的需求,jdbc 3.0 api 現(xiàn)在將獲取這種值變得很輕松。要確定任何所產(chǎn)生的關(guān)鍵字的值,只要簡(jiǎn)單地在語(yǔ)句的 execute() 方法中指定一個(gè)可選的標(biāo)記,表示您有興趣獲取產(chǎn)生的值。您感興趣的程度可以是 statement.return_generated_keys,也可以是 statement.no_generated_keys。在執(zhí)行這條語(yǔ)句后,所產(chǎn)生的關(guān)鍵字的值就會(huì)通過(guò)從 statement 的實(shí)例方法 getgeneratedkeys() 來(lái)檢索 resultset 而獲得。resultset 包含了每個(gè)所產(chǎn)生的關(guān)鍵字的列。清單 1 中的示例創(chuàng)建一個(gè)新的作者并返回對(duì)應(yīng)的自動(dòng)產(chǎn)生的關(guān)鍵字。

  清單 1. 檢索自動(dòng)產(chǎn)生的關(guān)鍵字

  statement stmt = conn.createstatement();

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

  stmt.executeupdate("insert into authors " +

  '(first_name, last_name) " +

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

  statement.return_generated_keys);

  resultset rs = stmt.getgeneratedkeys();

  if ( rs.next() ) {

  // retrieve the auto generated key(s).

  int key = rs.getint();

  }

  jta/jts

  1.jta/jts基本知識(shí)

  服務(wù)器實(shí)現(xiàn)jts是否對(duì)應(yīng)用程序開(kāi)發(fā)人員來(lái)說(shuō)不是很重要的。

  對(duì)你來(lái)說(shuō),應(yīng)該把jta看作是可用的api。

  jta是用來(lái)開(kāi)發(fā)distributed tansaction的 api.

  而jts定義了支持jta中實(shí)現(xiàn)transaction manager 的規(guī)范。

  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 事務(wù)處理的概念

  jta實(shí)際上是由兩部分組成的:一個(gè)高級(jí)的事務(wù)性客戶接口和一個(gè)低級(jí)的 x/open xa接口。

  我們關(guān)心的是高級(jí)客戶接口,因?yàn)閎ean可以訪問(wèn)它,而且是推薦的客戶應(yīng)用程序的事務(wù)性接口。

  低級(jí)的xa接口是由ejb服務(wù)器和容器使用來(lái)自動(dòng)協(xié)調(diào)事務(wù)和資源(如數(shù)據(jù)庫(kù))的

  1.1.1事務(wù)劃分

  a.程序劃分

  使用usertransaction啟動(dòng)jta事務(wù)

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


看了“java讀書(shū)心得”又看了:

1.java學(xué)習(xí)心得體會(huì)范文

2.java web學(xué)習(xí)心得

3.java學(xué)習(xí)心得

4.java培訓(xùn)心得體會(huì)

5.java面向?qū)ο髮W(xué)習(xí)心得

6.java實(shí)訓(xùn)心得體會(huì)

3236756