使用WebLogic Platform構(gòu)建音樂站點(diǎn)
Orienginal URL: http://dev2dev.bea.com.cn/bbs/yuanch/ArticleShow.jsp?Id=35
摘要
擁有自己的音樂站點(diǎn)是個不錯的想法,相比傳統(tǒng)的ASP或PHP站點(diǎn),我們將采用J2EE架構(gòu)實(shí)現(xiàn)多層結(jié)構(gòu)的,高度可擴(kuò)展的站點(diǎn)。您將看到,采用J2EE技術(shù),加上強(qiáng)大的WebLogic平臺,我們能更容易的實(shí)現(xiàn)一個音樂站點(diǎn)應(yīng)用,而非傳統(tǒng)意義上的平面結(jié)構(gòu)的網(wǎng)站。
簡介
隨著J2EE的快速普及,越來越多的開發(fā)人員都想編寫基于J2EE架構(gòu)的分布式的企業(yè)級應(yīng)用程序。為了降低開發(fā)難度,J2EE提供的基于組件的,分層的分布式應(yīng)用模式,使具有可伸縮,可擴(kuò)展和易維護(hù)等優(yōu)點(diǎn)。利用J2EE,可以快速開發(fā)、部署和管理多層結(jié)構(gòu)、面向Web的,以服務(wù)器為中心的企業(yè)級應(yīng)用。
在下面的這個示例中,我們將構(gòu)建一個基于J2EE的音樂站點(diǎn),暫定名為JetMusic,計(jì)劃給用戶提供瀏覽,下載等在線服務(wù)。事實(shí)上,Internet上已有很多這種類型的站點(diǎn),但是它們大多是傳統(tǒng)的基于兩層結(jié)構(gòu)的模型,使用了混合HTML和ASP或PHP腳本代碼的頁面。
盡管我們的JetMusic站點(diǎn)可能現(xiàn)在規(guī)模不大,僅僅使用JSP/JavaBeans/數(shù)據(jù)庫就已經(jīng)足夠了,但是作為示例,我們還是打算用J2EE來實(shí)現(xiàn)它。借助J2EE的強(qiáng)大功能,我們能夠輕易地快速創(chuàng)建這樣一個音樂站點(diǎn),并且使我們的編碼量最小。更重要的是,它是完全的3層分布式結(jié)構(gòu),具有很強(qiáng)的擴(kuò)展性。
我們的站點(diǎn)需要對用戶提供瀏覽,下載等服務(wù),還要允許系統(tǒng)管理員能隨時登陸并管理站點(diǎn)資源。對于我們的JetMusic站點(diǎn),我們計(jì)劃使用樹型結(jié)構(gòu)來組織分類、藝術(shù)家、專輯、歌曲,一個簡單的示例圖如下:
對用戶而言,我們需要提供以下服務(wù):
用戶可以瀏覽分類、藝術(shù)家、專輯、歌曲、歌詞。
用戶可以按關(guān)鍵字模糊搜索歌曲,專輯,藝術(shù)家和歌詞。
用戶可以對某一首歌評分。
如果歌曲文件存在,用戶可以下載歌曲。
如果歌詞存在,用戶可以瀏覽歌詞。
為了管理站點(diǎn)資源,我們把使用者分為用戶和管理員兩類:
用戶可以注冊,更改自己的信息。
管理員可以創(chuàng)建或刪除分類,藝術(shù)家,專輯,歌曲。
以上可以簡單看作是我們分析的全部用例。我們將采用J2EE標(biāo)準(zhǔn)的三層結(jié)構(gòu)模型,將系統(tǒng)分為表示層,邏輯層和持久層(EIS層就免了,因?yàn)槲覀儾]有所謂的“遺產(chǎn)系統(tǒng)”),下面將詳細(xì)討論設(shè)計(jì)方案。
通常,設(shè)計(jì)總是從域模型開始的,我們通過對用例的分析,可以建立以下實(shí)體:
分類對象(Category),藝術(shù)家對象(Artist),專輯對象(Album),歌曲對象(Song),這些對象是簡單的一對多關(guān)系。我們把這些對象都一一映射為實(shí)體Bean,由于這些對象最終映射為數(shù)據(jù)庫表,這些表的結(jié)構(gòu)相對簡單,因此我們選擇CMP實(shí)現(xiàn)。相比BMP,CMP不僅大大簡化了數(shù)據(jù)庫訪問的代碼,而且由容器管理的特性通常使CMP比BMP具有更好的緩沖性能和可移植性。
在邏輯層,毫無疑問,會話Bean將是最好的選擇。如果不使用Session Bean,您可能需要自行處理多線程同步,安全,事務(wù)處理等問題,這將是一項(xiàng)復(fù)雜而艱巨的工程。由于容器自動為我們處理了大量的如事務(wù),安全,多線程等底層服務(wù)操作,我們就只需關(guān)注于我們的業(yè)務(wù)邏輯。此外,對于異步調(diào)用,消息驅(qū)動Bean是不錯的選擇。
在表示層,我們用JSP頁面將界面呈現(xiàn)給用戶。有過網(wǎng)站開發(fā)經(jīng)驗(yàn)的開發(fā)人員一定有過這樣的深刻感受,HTML元素和JSP代碼混合在一起是多么巨大的災(zāi)難,它將導(dǎo)致可維護(hù)性隨著頁面數(shù)量的增加呈指數(shù)增長。
開源的Struts模型通過MVC架構(gòu)大大簡化了JSP前端的開發(fā)。但是,使用Struts還要求開發(fā)人員對于Struts底層結(jié)構(gòu)和配置文件有相當(dāng)?shù)牧私狻?/SPAN>WebLogic提供的Java Page Flow技術(shù)完全基于Struts技術(shù),并且隱藏了更多的底層細(xì)節(jié),提供了圖形化的頁面導(dǎo)航功能,大大簡化了Web層的開發(fā)。此外,大量的NetUI標(biāo)簽和數(shù)據(jù)綁定技術(shù),使您的JSP頁面立刻具備了可視化開發(fā)的功能。我們將采用各種實(shí)現(xiàn)方式來編寫Web層。
J2EE僅僅是一個標(biāo)準(zhǔn),眾多的廠商提供了相應(yīng)的實(shí)現(xiàn)平臺,其中,BEA的WebLogic無疑是最優(yōu)秀的J2EE平臺之一。我們將把JetMusic站點(diǎn)建立在WebLogic Platform 8.1平臺上,并采用WebLogic Workshop 8.1這個強(qiáng)大的IDE作為開發(fā)工具。你可以免費(fèi)從BEA官方站點(diǎn)上下載非商業(yè)目的開發(fā)使用的5-IP限制版本的WebLogic Platform 8.1:
http://commerce.bea.com/showproduct.jsp?family=WLP&major=8.1&minor=2
我們的站點(diǎn)資源除了歌曲文件外,將全部存放在關(guān)系數(shù)據(jù)庫中。選用MS SQL Server 2000的原因是這個數(shù)據(jù)庫對硬件資源的消耗要比Oracle少,適合于我們作開發(fā)使用。如果您計(jì)劃采用Oracle或其他數(shù)據(jù)庫,沒有關(guān)系,您只需修改實(shí)體Bean的相關(guān)部署配置,即可立刻移植到其他廠商的數(shù)據(jù)庫上。
要流暢地運(yùn)行WebLogic Server 8.1和WebLogic Workshop 8.1,您至少需要512M內(nèi)存,如果僅有256M內(nèi)存,您可以修改WebLogic的啟動參數(shù),指定較小的JVM內(nèi)存(如128M)。
配置數(shù)據(jù)庫:
啟動MS SQL Server,打開企業(yè)管理器,新建數(shù)據(jù)庫music,請注意我們并不需要建立任何表,稍候部署我們的應(yīng)用時WebLogic會自動創(chuàng)建相應(yīng)的表。
配置WebLogic:
新建一個名為“music”的配置,并選擇模板Basic Weblogic Workshop Domain,以便能使用Workshop進(jìn)行開發(fā)和調(diào)試。
啟動WebLogic,打開瀏覽器,輸入http://localhost:7001/console,登陸,在左邊找到music→Services→JDBC→Connection Pools,新建一個連接池,選擇數(shù)據(jù)庫“MS SQL Server”,驅(qū)動程序“BEAs MS SQL Server Driver(Type 4) Versions:7.0, 2000”,填好數(shù)據(jù)庫名,用戶名,口令等,測試無誤后部署。然后選擇左邊的music→Services→JDBC→Data Sources,新建一個名為“jdbc/MusicDataSource”的數(shù)據(jù)源,使用剛才建好的連接池,部署。
啟動Workshop,選擇New→Application新建應(yīng)用程序Music,然后選擇Browse,找到服務(wù)器配置文件“<BEA安裝目錄>user_projectsdomainsmusicconfig.xml”,確定后創(chuàng)建一個應(yīng)用程序。
為了有效組織和管理代碼,我們把所有的實(shí)體Bean均放在包music.ejb.db中,所有的會話Bean放在music.ejb中,另外建一個music.shared包用于存放會話Bean和表示層JSP/Servlets共享的Java類,包括各種自定義異常,傳遞的值對象等。
我們將創(chuàng)建3個工程,分別為MusicEjb Project,實(shí)現(xiàn)持久層和邏輯層;MusicClient Project,用于在命令行測試和調(diào)試邏輯層和持久層;MusicWeb Project,用于實(shí)現(xiàn)表示層。創(chuàng)建好的結(jié)構(gòu)在Workshop中顯示如下:
我們首先開始設(shè)計(jì)持久層,通過前面的分析,我們抽象出以下實(shí)體Bean:
Category實(shí)體Bean:代表一個分類;
Artist實(shí)體Bean:代表一個藝術(shù)家;
Album實(shí)體Bean:代表一個專輯;
Song實(shí)體Bean:代表一首歌曲;
Account實(shí)體Bean:代表一個用戶。
對應(yīng)的CMR關(guān)系為:
Category-Artist:一對多
Artist-Album:一對多
Album-Song:一對多
先建立一個簡單的名為Category的Entity Bean:展開左側(cè)MusicEjb→music→ejb→db,選擇菜單File→New→Entity Bean,在設(shè)計(jì)視圖中分別添加3個CMP字段,一個Create方法,一個Finder方法,另外我們還添加了一個copy方法用于返回一個Value Object對象:
然后在右邊的屬性面板中為Entity Bean設(shè)置屬性,在這里我們的主要設(shè)置如下:
data-source-name: jdbc/MusicDataSource
default-transaction: Required
table-name: category
Local EJB
JNDI name: ejb/Category
Bean class name: CategoryLocal
Home class name: CategoryLocalHome
為了實(shí)現(xiàn)自增主鍵的功能,需要指定一個Ejb-Gen屬性:點(diǎn)擊右鍵彈出菜單,選擇Insert EJB Gentag→automatic-key-generation,指定字段名id,數(shù)據(jù)庫類型SQLServer2000即可。
為了提高CMP的性能,我們?nèi)坎捎帽镜亟涌冢绻承?/SPAN>CMP字段需要提供只讀接口(如id,username字段),只需右鍵點(diǎn)擊字段名,然后選擇“Read Only”。
按相同方法建立Artist.ejb,Album.ejb,Song.ejb,Account.ejb,然后創(chuàng)建CMR關(guān)系:
打開Category.ejb的設(shè)計(jì)視圖,點(diǎn)擊右鍵,在彈出菜單里選擇Add Relation,建立一對多的CMR關(guān)系:
類似的,創(chuàng)建Artist-Album和Album-Song的一對多關(guān)系。
注意我們還設(shè)計(jì)了一個AccountUtil類,使用正則表達(dá)驗(yàn)證用戶信息的有效性,比如用戶名,口令是否符合要求。
首先我們設(shè)計(jì)一個JndiHelper類,用于封裝查找實(shí)體Bean的JNDI操作,同時還對實(shí)體Bean的Home接口緩存。
我們把所有的邏輯封裝到3個Session Bean中:
MusicView.ejb:用于封裝瀏覽,下載等頁面操作。
AccountManage.ejb:用于封裝注冊,登陸等賬號操作。
MusicManage.ejb:用于封裝管理員的各項(xiàng)操作。
首先建立MusicView.ejb,我們一共設(shè)計(jì)了以下業(yè)務(wù)方法:
所有的方法均為遠(yuǎn)程方法,這樣Web層和EJB就可分開部署。當(dāng)然你也可以將會話Bean接口全部改成本地接口以進(jìn)一步提高性能。方法看上去雖多,但邏輯相當(dāng)簡單,例如,getAlbums(int artistId)方法:
基本邏輯大致為:
查找相應(yīng)的實(shí)體Bean,獲得實(shí)體Bean對應(yīng)CMR關(guān)系的集合,在將其包裝成值對象返回給客戶端。你可以看到,由于沒有JDBC操作,代碼被大大的簡化了,并且由于容器處理了底層數(shù)據(jù)庫連接,使我們的代碼更加健壯。
在這里我們采用了值對象(Value Object)模式,用于在Web層和邏輯層之間傳送對象。你可以很容易的寫出每個實(shí)體Bean對應(yīng)的值對象,比如Album.ejb對應(yīng)的值對象AlbumVO。
然后創(chuàng)建AccountManage.ejb,用于處理用戶帳號相關(guān)的操作:
如果要提高系統(tǒng)的安全性,建議使用MD5碼存儲用戶口令,MD5算法是一個單向函數(shù),即使獲得數(shù)據(jù)庫表也無法得知用戶口令。如果要進(jìn)一步防止使用預(yù)先算好的MD5碼攻擊,還可以采用加鹽處理。為了簡單起見,我們直接將用戶口令存儲在數(shù)據(jù)庫表的字段中,因此login(String username, String password)看起來像這樣:
如果找到了相應(yīng)的實(shí)體Bean(即數(shù)據(jù)庫表中存在此記錄),再判斷password字段,如果相符,驗(yàn)證通過,否則,拋出一個自定義的UnauthorizedException異常。這里也不涉及JDBC操作,因此代碼非常簡單。
搜索功能是通過實(shí)體Bean的Finder方法實(shí)現(xiàn)的,標(biāo)準(zhǔn)的EJB QL 2.0并不支持帶參數(shù)的like關(guān)鍵字(在SUN J2EE SDK中編譯就會失敗),幸好WebLogic對其進(jìn)行了擴(kuò)充。為了實(shí)現(xiàn)模糊搜索,這里我們定義了Song.ejb的一個Finder方法findByTitle(String title),對應(yīng)的EJB QL為“SELECT OBJECT(o) FROM Song AS o WHERE lower(o.title) LIKE concat(%, concat(?1, %))”。如果使用其他廠商的服務(wù)器,你需要查看廠商的EJB QL文檔然后作相應(yīng)的修改。
最后一個是MusicManage.ejb,用于管理員創(chuàng)建、刪除信息:
創(chuàng)建和刪除實(shí)體Bean的代碼都非常簡單,唯一需要的就是捕獲相應(yīng)的異常,我們在deleteSong(int songId)中將RemoveException包裝成更一般的ApplicationException異常返回客戶端:
需要特別注意的是,對存在一對多CMR關(guān)系的實(shí)體Bean,如果指定了級聯(lián)刪除,當(dāng)刪除“一”時,對應(yīng)的“多”會被自動刪除,因此執(zhí)行刪除前要異常小心,至少應(yīng)該提示用戶,或者,只允許刪除“多”為空的實(shí)體Bean,比如刪除Artist.ejb時:
home = JndiHelper.getArtistLocalHome();
artist = home.findByPrimaryKey(new Integer(artistId));
Collection c = artist.getAlbums();
if(c.size()>0) throw new Exception("Cannot delete unless it is empty.");
為了安全起見,我們在刪除時不允許刪除“多”一方不為空的實(shí)體。
編譯,部署。OK,小功告成!現(xiàn)在我們可以測試一下我們的邏輯層。一個好的辦法是使用JUnit測試,但是似乎Workshop尚未集成JUnit。沒關(guān)系,我們自己寫一個客戶端Java程序來測試邏輯層。
在MusicClientProject中建立Client.Java類,放在包music.client中。為了測試,我們首先在數(shù)據(jù)庫中創(chuàng)建一些測試數(shù)據(jù):
void initData () throws Exception { … }
然后,我們寫一個testGetCategories()方法:
void testGetCategoris(int parentCategoryId) throws Exception { … }
類似的,我們對每個業(yè)務(wù)邏輯都寫一個相應(yīng)的測試方法,直到每一個業(yè)務(wù)邏輯都正確無誤。在一個獨(dú)立的Java客戶端程序中測試EJB要比在JSP中方便得多,你可以方便地設(shè)置斷點(diǎn),跟蹤以便查看變量,隨時使用System.out.println()在控制臺輸出任何調(diào)試信息。
表示層用于向用戶提供系統(tǒng)交互的接口。采用J2EE的系統(tǒng)表示層一般都是瘦客戶端,使用JSP/Servlets技術(shù),使用戶能通過瀏覽器使用系統(tǒng)。在JetMusic站點(diǎn)中,我們將考慮以下幾種實(shí)現(xiàn)方式:
1.在JSP中使用業(yè)務(wù)代表模式:
通常,在JSP/Servlets中直接調(diào)用EJB并不是一個好主意,這需要大量的查找JNDI的代碼,業(yè)務(wù)代表(Business Delegate)是一個不錯的模式,它封裝了所有的EJB查找和調(diào)用,使得表示層和邏輯層的耦合度能降到最低,并且還可以進(jìn)行一些緩存。
由于業(yè)務(wù)代表類將Web和EJB隔開了,因此,對于JSP/Servlets來說,它們根本就不知道EJB的存在。這將帶來另一個好處:只要在設(shè)計(jì)時仔細(xì)定義了業(yè)務(wù)代表的接口,Web層和EJB的開發(fā)人員立即可以同時開發(fā)各自的模塊,Web層的開發(fā)人員可以首先對業(yè)務(wù)代表類進(jìn)行硬編碼,以便返回他們希望的結(jié)果。等到EJB開發(fā)完成后,再用實(shí)際的EJB調(diào)用替換即可。
為了封裝對MusicView.ejb的所有調(diào)用,我們建立一個MusicViewBD的業(yè)務(wù)代表類:
在index.jsp中即可使用MusicViewBD以便輸出Categories:
2.使用NetUI標(biāo)簽實(shí)現(xiàn)數(shù)據(jù)綁定
WebLogic提供了大量的NetUI標(biāo)簽,能夠方便地在JSP中綁定數(shù)據(jù)。我們下一步將創(chuàng)建一個viewCa.jsp頁面,此頁面向用戶展示分類。
我們首先創(chuàng)建一個EJB Control。WebLogic向我們提供的EJB Control完全封裝了EJB調(diào)用。利用EJB Control,我們不用寫一行代碼,立刻就可以在JSP中調(diào)用EJB。這個EJB Control可以看作是一個用標(biāo)簽封裝的業(yè)務(wù)代表模式的應(yīng)用。
在MusicWeb工程下新建文件夾music.control,用于存放EJB Control。新建EJB Control,命名為CallMusicView:
選擇“Browse application EJBs…”,直接找到“MusicView (remote jndi)”,Workshop會自動填好相應(yīng)的接口,點(diǎn)擊“create”即創(chuàng)建成功。
當(dāng)我們獲得了從EJB返回的Collection后,可以使用Repeater標(biāo)簽顯示這個復(fù)雜的數(shù)據(jù),在這里我們不打算進(jìn)一步討論Repeater標(biāo)簽的細(xì)節(jié),關(guān)于如何使用Repeater標(biāo)簽,可以參考下面的文章:
http://dev2dev.bea.com/products/wlworkshop81/articles/repeater.jsp
以下JSP頁面顯示了如何使用EJB Control調(diào)用EJB的getCategories遠(yuǎn)程方法,并將返回的Collection結(jié)果集用Repeater標(biāo)簽以超鏈接的形式顯示出來,這里還用到了一個netui:anchor標(biāo)簽:
第一個DeclareControl標(biāo)簽申明了一個Control,名為ctrlMusicView,第二個CallControl標(biāo)簽調(diào)用控件ctrlMusicView的一個方法getCategories并附帶參數(shù)MethodParameter,參數(shù)值由URL的id確定,然后將結(jié)果放在變量categories中。Repeater標(biāo)簽從categories取得數(shù)據(jù)源,然后循環(huán)顯示集合中的每個元素。
對應(yīng)的源代碼看起來是這樣:
運(yùn)行結(jié)果在IE中顯示如下:
類似地,您可以自己“畫”出列藝術(shù)家,列專輯的頁面,然后將它們組合起來。這些JSP頁面僅僅是通過簡單的鼠標(biāo)拖放和屬性設(shè)置完成的,真是太棒了!
3.使用Java Page Flow
Java Page Flow是完全基于開源的Struts模型,但提供了更強(qiáng)的易用性和自動化的狀態(tài)管理,支持?jǐn)?shù)據(jù)綁定,擁有更強(qiáng)大的動作和異常處理。下一步,我們將創(chuàng)建一個名為FileUploadController的頁面流,完成一個文件上傳的功能。
新建頁面流fileUpload,Workshop自動為我們創(chuàng)建了一個FileUploadController.jpf,這個jpf作為控制器,我們再添加一個uploadFile的Action,包含一個名為“UploadForm”的ActionForm,3個JSP文件,然后設(shè)置導(dǎo)航如下:
詳細(xì)代碼請下載源代碼包。
使用Java Page Flow的最大的優(yōu)點(diǎn)是完全的MVC架構(gòu),有清晰的導(dǎo)航模型,并且配合NetUI標(biāo)簽,實(shí)現(xiàn)起來更為簡單。
以上討論了基本的瀏覽頁面,下面我們要實(shí)現(xiàn)用戶登陸的功能和針對管理員的管理功能。
實(shí)現(xiàn)用戶登陸
為了跟蹤用戶,我們創(chuàng)建一個AccountManageBD的業(yè)務(wù)代理類,并將它放在Session中,封裝所有與用戶帳號相關(guān)的操作。幾個關(guān)鍵的方法如下:
String getName() // 返回用戶登陸名
boolean isAdmin() // 是否是管理員
void login(String username, String password) // 登陸系統(tǒng)
我們在MusicSessionListener中監(jiān)聽Session事件,以便創(chuàng)建和銷毀與Session關(guān)聯(lián)的AccountManageBD對象。然后在/WEB-INF/web.xml中注冊MusicSessionListener。
這樣,任何時候均可在JSP中調(diào)用
AccountManageBD account = (accountManageBD)
session.getAttribute(AccountManageBD.ACCOUNT);
來訪問用戶當(dāng)前登陸信息。
創(chuàng)建一個登陸頁面流LoginController.jpf實(shí)現(xiàn)登陸頁面:
類似的,一個registerUser頁面流實(shí)現(xiàn)用戶注冊功能:
實(shí)現(xiàn)管理功能
為了能使管理員登陸后管理站點(diǎn),我們把所有的管理頁面放在目錄{MusicWeb}/admin/下,為了防止未授權(quán)用戶訪問任何/admin/下的任何頁面,我們準(zhǔn)備一個過濾器AdminFilter,將所有未授權(quán)的操作重定向到/login/LoginController.jpf中。核心代碼如下:
修改/WEB-INF/web.xml,添加過濾器申明:
最后,你只需要用Dreamwaver之類的網(wǎng)頁制作軟件強(qiáng)化界面,然后把這些JSP及頁面流組織起來,即可發(fā)布您的JetMusic站點(diǎn)。
正如你所看到的,我們的安全是通過Web層的登陸驗(yàn)證實(shí)現(xiàn)的,在邏輯層并未使用基于角色的驗(yàn)證邏輯,對于我們現(xiàn)在的站點(diǎn)來說,可能已經(jīng)足夠了。不過,如果您打算將來向用戶提供付費(fèi)下載,付費(fèi)收聽的業(yè)務(wù),那么就需要切實(shí)保證系統(tǒng)的安全性。通常,不建議您自己開發(fā)安全邏輯,因?yàn)殚_發(fā)防攻擊的安全邏輯本身就不是一個簡單的任務(wù),此外,自定義的安全邏輯可能會導(dǎo)致較低的可重用性。
從Java 1.4和J2EE 1.3開始,Java驗(yàn)證與授權(quán)服務(wù)JAAS(Java Authentication and Authorization Service)就被引入到核心包中。JAAS實(shí)現(xiàn)了驗(yàn)證和授權(quán)兩類服務(wù),驗(yàn)證服務(wù)能夠可靠并安全地確定目前是誰在執(zhí)行代碼,在我們的這個應(yīng)用中,只需要用到JAAS的驗(yàn)證服務(wù)。以下是JAAS驗(yàn)證的一般步驟:
1.創(chuàng)建一個LoginContext實(shí)例。
2.指定LoginContext的配置文件。
3.加載指定的LoginModule。
4.客戶端調(diào)用LoginContext的login方法。
5.如果登陸成功,就會將一個通過身份驗(yàn)證的Principal和Subject聯(lián)系起來。
6.LoginContext將通過身份驗(yàn)證的Subject返回客戶機(jī)。
在WebLogic中,缺省的用戶,組和角色都是在XML配置文件中指定的,我們只需要提供一個登陸頁面,包含一個名為j_security_check的Form,一個名為j_username的TextBox和一個名為j_password的PasswordBox,然后在/WEB-INF/web.xml中配置即可使用WebLogic默認(rèn)的JAAS身份驗(yàn)證。但是,這些用戶是靜態(tài)的,無法滿足我們使用數(shù)據(jù)庫動態(tài)管理用戶的需求。好在JAAS本身就是一個“可插拔”的模塊,我們可以輕易地使用自定義的安全模塊實(shí)現(xiàn)驗(yàn)證功能。
要在WebLogic中實(shí)現(xiàn)自定義的安全驗(yàn)證,需要提供一個Security Provider,包括自定義的Authentication Provider,Login Module,Identity Assertion,Principal Validation Provider,Role Mapping Provider,看上去有點(diǎn)復(fù)雜,不過,你可以從BEA站點(diǎn)下載一個示例代碼:
http://dev2dev.bea.com/codelibrary/code/security_prov81.jsp
然后修改相應(yīng)的實(shí)現(xiàn)類,配置部署,即可實(shí)現(xiàn)自定義的JAAS驗(yàn)證。
使用JAAS驗(yàn)證的好處是,驗(yàn)證邏輯從頁面中分離,對頁面的限制訪問是通過/WEB-INF/web.xml中的配置指定的,無需自定義過濾器;在調(diào)用EJB時,Web容器能隱含的把Principal傳遞給EJB容器,從而和EJB的安全限制聯(lián)系起來。
在我們的JetMusic站點(diǎn)中,目前僅僅使用Session+過濾器的機(jī)制,也許可以考慮在下一個版本中加入JAAS驗(yàn)證,以便更清晰地劃分表示層邏輯和安全邏輯。
可以直接在Workshop中啟動WebLogic Server,即可自動完成部署。如果部署成功,WebLogic不會輸出提示信息,如果部署失敗,會提示異常信息。
常見的異常有:
JDBC連接出錯:沒有啟動數(shù)據(jù)庫,或者沒有找到對應(yīng)JNDI名稱的數(shù)據(jù)庫。你需要檢查JNDI設(shè)置和數(shù)據(jù)庫是否已經(jīng)啟動。
INSERT語句出錯:這是創(chuàng)建實(shí)體Bean時容器的INSERT語句出錯。如果指定了automatic-key-generation,第一次部署時WebLogic自動創(chuàng)建的主鍵為INT類型,但并不是AUTOINCREASE,需要打開數(shù)據(jù)庫,手動更改主鍵設(shè)置,或者,您可以直接下載示例數(shù)據(jù)庫,然后導(dǎo)入到SQL Server2000即可。
我們已經(jīng)利用J2EE技術(shù)在WebLogic Server上基本建立起了一個健壯的,可擴(kuò)展的JetMusic音樂站點(diǎn),其中涉及到EJB,JSP,Servlets,NetUI,Java Page Flow,JAAS以及幾個常用的EJB設(shè)計(jì)模式等。相信您能從這個小小的Web應(yīng)用中看到J2EE體系強(qiáng)大的功能。由于時間倉促,水平有限,文中不免會有一些錯誤,懇請讀者指正。最后希望本文能夠給您帶來一點(diǎn)收獲。最后申明:如果您使用JetMusic系統(tǒng)在網(wǎng)上發(fā)布音樂,所引起的一切版權(quán)糾紛本文作者概不負(fù)責(zé)。
JetMusic站點(diǎn)的全部源代碼(Workshop 8.1工程)和示例數(shù)據(jù)庫:
http://javap2p.nease.net/src/jetmusic.zip
Sun J2EE Tutorial,http://java.sun.com/j2ee/tutorial/1_3-fcs/index.html
EJB設(shè)計(jì)模式,[美]Floyd Marinescu
EJB 2.0企業(yè)級應(yīng)用程序開發(fā),[美]Chuck Cavaness,Brian Keeton
BEA WebLogic Server寶典,[美]Joe Zuffoletto
WebLogic Workshop Help,http://e-docs.bea.com/workshop/docs81/doc/en/core/index.html
關(guān)于作者
廖雪峰(dev2dev論壇ID:xuefengl)
北京郵電大學(xué)在校本科生,信息工程專業(yè),對J2EE/J2ME開發(fā)有濃厚興趣。
posted on 2005-12-02 10:38 Xuefeng's Weblog 閱讀(401) 評論(0) 編輯 收藏 所屬分類: J2EE