J2EE表現(xiàn)層設(shè)計(jì)思考核心
J2EE表現(xiàn)層設(shè)計(jì)思考核心是什么?下面yjbys小編為大家分享最新J2EE表現(xiàn)層設(shè)計(jì)解讀,希望對(duì)大家學(xué)習(xí)J2EE有所幫助!
設(shè)計(jì)表現(xiàn)層時(shí)需要考慮的幾個(gè)問題
開發(fā)者在設(shè)計(jì)表現(xiàn)層時(shí),可以使用不同的模型,這時(shí)需要考慮一些相關(guān)的設(shè)計(jì)問題。這些問題和模型關(guān)系的緊密程度也各有不同,它們可以影響系統(tǒng)的各個(gè)方面,包括有安全、數(shù)據(jù)完整性、可管理性和擴(kuò)展性。雖然這些設(shè)計(jì)問題大部分都可以用模型的形式表示,但我們不打算這樣做,因?yàn)檫@樣更為抽象,我們選擇以非正式的文檔形式表示。我們只是根據(jù)不同的模型,將每個(gè)需要考慮的問題列出來。
Session管理
用戶Session指的是跨越一個(gè)客戶和服務(wù)器多個(gè)請(qǐng)求間的一個(gè)對(duì)話。我們將在以下部分根據(jù)用戶Session的概念討論這個(gè)問題。
客戶端的Session狀態(tài)
在客戶端保存Session的狀態(tài)指的是將Session的狀態(tài)串行化并且嵌入到返回給客戶的HTML頁面中。
在客戶端保存Session的狀態(tài)有這以下的好處:
. 它實(shí)現(xiàn)起來相對(duì)容易
. 在保存少量的狀態(tài)信息時(shí),它工作得很好
此外,這個(gè)策略還消除了跨越多個(gè)服務(wù)器復(fù)制狀態(tài)的問題,例如多個(gè)服務(wù)器間實(shí)現(xiàn)負(fù)載均衡時(shí)就會(huì)遇到這種情況。
在客戶端保存Session狀態(tài)通常有兩個(gè)方法HTML的隱藏字段和HTTP cookies我們將在下面討論這些策略。第三個(gè)策略則是在每個(gè)頁面的URL中嵌入Session狀態(tài)信息。
雖然第三個(gè)方法比較少見,但它也有著其它兩個(gè)方法的許多限制。
HTML的隱藏字段(HTML Hidden Fields)
雖然這個(gè)方法實(shí)現(xiàn)起來相對(duì)容易,不過使用HTML隱藏字段在客戶端保存Session狀態(tài)仍然有著許多的缺點(diǎn)。這些缺點(diǎn)在保存大量的狀態(tài)時(shí)尤為突出。保存大量的狀態(tài)將會(huì)對(duì)性能有很大的影響。因?yàn)槊看伟l(fā)出請(qǐng)求和響應(yīng)時(shí),都需要在網(wǎng)絡(luò)中傳送這些狀態(tài)信息。
此外,當(dāng)你利用隱藏的字段來保存Session狀態(tài)時(shí),這些持久的狀態(tài)值只能是字符串值,因此所有的對(duì)象引用都必須被“字符串化”,而這些信息除非經(jīng)過特別的加密,否則都是以明文的形式顯示在HTML的源代碼中。
HTTP Cookies
與隱藏字段的方法一樣,使用HTTP Cookies的方式也是相對(duì)簡單的。不幸的是,這兩個(gè)方法有著許多相同的缺點(diǎn)。特別是,在保存大量的狀態(tài)信息時(shí)將會(huì)對(duì)性能產(chǎn)生很大的影響,因?yàn)樵诿看蔚恼?qǐng)求和響應(yīng)時(shí),都必須在網(wǎng)絡(luò)上傳送全部的Session狀態(tài)信息。
在客戶端保存Session狀態(tài)時(shí),我們也會(huì)遇到大小和類型的局限問題。cookie headers的大小是有限制的,這樣就限制了可以被持久保存的數(shù)據(jù)量,而且和隱藏字段的方法一樣,當(dāng)你使用cookies來保存Session狀態(tài)時(shí),這些持久的狀態(tài)信息只能使用字符串值。
在客戶端保存Session狀態(tài)會(huì)帶來的安全問題
當(dāng)你在客戶端保存Session狀態(tài)時(shí),你必須考慮到由此帶來的安全問題。如果你不想數(shù)據(jù)暴露給客戶端,你就需要一些方法來加密數(shù)據(jù),從而保證數(shù)據(jù)的安全。
雖然在客戶端保存Session狀態(tài)相對(duì)容易實(shí)現(xiàn),不過它有著很多的缺點(diǎn),這些都要我們花費(fèi)時(shí)間去解決。對(duì)于需要處理大量數(shù)據(jù)的項(xiàng)目,特別是企業(yè)的系統(tǒng),使用這種方式是得不償失的。
表現(xiàn)層的Session狀態(tài)
當(dāng)Session狀態(tài)保存在服務(wù)器端時(shí),它使用一個(gè)Session ID得到,并且會(huì)一直保持住,直到發(fā)生以下的情形:
. 一個(gè)預(yù)定義的Session超時(shí)發(fā)生了
. Session被手動(dòng)設(shè)置為無效
. 狀態(tài)由Session中移除
要注意的是服務(wù)器關(guān)閉后,一些內(nèi)存中的Session管理機(jī)制可能不能恢復(fù)。
很明顯,對(duì)于要保存大量Session狀態(tài)的應(yīng)用,將它們的Session狀態(tài)放在服務(wù)器是更好的。當(dāng)狀態(tài)被保存在服務(wù)器上時(shí),你不會(huì)有客戶端Session管理的大小和類型限制。此外,還避免了由此帶來的安全問題,而且也不會(huì)遇到由于在每個(gè)請(qǐng)求間傳送Session狀態(tài)帶來的性能影響。
使用該方式,你可以更加靈活地作處理,并且便于擴(kuò)展和提高性能。
如果你在服務(wù)器上保存Session狀態(tài),你必須要決定如何使該狀態(tài)信息被每個(gè)服務(wù)器得到,即你運(yùn)行該應(yīng)用的服務(wù)器。如果群集的軟件是運(yùn)行在負(fù)載均衡的硬件上,那么就要處理這個(gè)Session狀態(tài)的復(fù)制問題,這是一個(gè)多維的問題,不過,眾多的應(yīng)用服務(wù)器現(xiàn)在都提供了各種各樣的解決方案。也就是說,在應(yīng)用服務(wù)器的級(jí)別上有解決的方法。其中的一個(gè)方法是保證用戶只與一個(gè)服務(wù)器打交道,它在流量管理軟件上用得比較多,例如Resonate [Resonate]的軟件,在用戶的Session中,該用戶發(fā)出的每個(gè)請(qǐng)求都會(huì)被路由到同一個(gè)服務(wù)器處理。這種方式也被稱為server affinity。
另一個(gè)可選的方式是在商業(yè)層或者資源層保存Session狀態(tài)。企業(yè)JavaBeans組件可用來在商業(yè)層保存Session的狀態(tài),而一個(gè)關(guān)系數(shù)據(jù)庫則可用在資源層。
控制客戶
有很多時(shí)候我們都要限制或者控制客戶端某些應(yīng)用資源。下面我們就來討論其中兩種這樣的情形。
限制或者控制客戶的一個(gè)原因是防止一個(gè)視圖或者部分的視圖被一個(gè)客戶直接。這個(gè)問題會(huì)發(fā)生在以下情況,例如僅有注冊(cè)或者登陸后的用戶才可允許一個(gè)特別的視圖,或者是根據(jù)用戶的角色限制用戶部分的視圖。
在描述過這個(gè)問題后,我們將討論第二種情況,它和控制應(yīng)用中一個(gè)用戶的流程有關(guān)。后者的討論和重復(fù)的form提交有關(guān),因?yàn)槎啻翁峤粚?huì)導(dǎo)致不必要的重復(fù)事務(wù)。
控制視圖
在一些情況下,資源被限制為完全不允許某些用戶。有幾個(gè)方法可以做到這一點(diǎn)。一個(gè)方法是加入應(yīng)用邏輯到處理控制器或者視圖的程序中,禁止某些用戶。另一個(gè)方案是設(shè)置運(yùn)行時(shí)的'系統(tǒng),對(duì)于一些資源,僅允許經(jīng)由另一個(gè)應(yīng)用資源內(nèi)部調(diào)用。在這種情形,對(duì)于這些資源的必須被通過另一個(gè)表現(xiàn)層的應(yīng)用資源進(jìn)行,例如一個(gè)servlet控制器。對(duì)于這些受限制的資源不允許通過一個(gè)瀏覽器直接調(diào)用。
處理這個(gè)問題的一個(gè)常見方法是使用一個(gè)控制器來作為該類控制的一個(gè)委托者。另一個(gè)常見的方式是在一個(gè)視圖中置入一個(gè)保護(hù)設(shè)置。我們這里主要討論基于視圖的控制策略。在考慮選擇何種方式來控制之前,我們首先來描述一下這些策略。
在視圖中置入保護(hù)邏輯
對(duì)于在一個(gè)視圖的處理中置入一個(gè)保護(hù)邏輯,有兩個(gè)常見的應(yīng)用。一個(gè)是防止整個(gè)的資源,而另一個(gè)是限制部分的資源。
在每個(gè)視圖中包含一個(gè)All-or-Nothing保護(hù)
在一些情況下,置入到視圖處理代碼中的邏輯以all-or-nothing的模式允許或者拒絕。也就是說,這個(gè)邏輯限制某個(gè)特別的用戶一個(gè)特別的視圖。通常這一類型的保護(hù)最好封裝到一個(gè)中央化的控制器中,這樣便于集中化管理。如果只有很少的頁面需要防護(hù),那么可以使用這個(gè)策略。通常這個(gè)情形都是發(fā)生在一個(gè)非技術(shù)人員需要更新網(wǎng)站一小部分的靜態(tài)文件。如果客戶仍然需要登陸到網(wǎng)站來瀏覽這些頁面,那么只需要在每個(gè)頁面的頂部加入一個(gè)自定義的tag(標(biāo)記)就可以做到控制。如3.1的例子所示。
例子3.1 在每個(gè)視圖中包含一個(gè)All-or-Nothing保護(hù)
給視圖的某些部分加入保護(hù)
在其它情況下,置入到視圖處理代碼的邏輯可拒絕一個(gè)視圖的某些部分。這個(gè)策略可以和上面的all-or-nothing策略一起使用。為說明這一點(diǎn),我們這里使用控制一個(gè)建筑物中的一個(gè)房間作類比。all-or-nothing的保護(hù)策略告訴用戶是否可以進(jìn)入房間,而第二個(gè)保護(hù)策略則是告訴用戶在進(jìn)入房間后,允許他們看到什么東西。以下就是一些你可以利用這個(gè)策略的例子。
根據(jù)用戶的角色決定是否顯示視圖的某些部分
根據(jù)用戶的角色,視圖的某部分可能不顯示。例如,一個(gè)經(jīng)理在收看管理信息時(shí),他可以到其員工的子視圖,而作為一個(gè)員工,他只可以看到自己組織的信息,而不可以其它信息,如例子3.2所示。
例子3.2 根據(jù)用戶的角色,部分的視圖不顯示
This should be seen only by managers!
根據(jù)系統(tǒng)的狀態(tài)或者錯(cuò)誤情形不顯示部分的視圖
根據(jù)系統(tǒng)的環(huán)境,顯示的規(guī)劃可以被修改。例如,如果用戶使用的是一個(gè)單CPU的硬件設(shè)備,那么使用多個(gè)CPU的部分設(shè)備就可以不顯示。
根據(jù)配置控制資源
要限制某個(gè)客戶直接一個(gè)特別的視圖,你可以配置表現(xiàn)層只有通過內(nèi)部的資源才可以到這些資源,例如一個(gè)使用RequestDispatcher的servlet控制器。此外,你還可以使用Web容器中內(nèi)置
的安全技術(shù),根據(jù)servlet2.2或者以后的規(guī)范。安全限制被定義在稱為web.xml的配置描述文件中(deployment descriptor)。
basic和form-based的認(rèn)證方法在Servlet規(guī)范中也有描述。在此我們不打算重復(fù)這個(gè)規(guī)范,你可以到以下網(wǎng)址去查看當(dāng)前規(guī)范的細(xì)節(jié)(http://java.sun.com/products/servlet/)。
你已經(jīng)明白了加入安全限制到你的應(yīng)用時(shí)會(huì)有什么用處,我們簡要討論了這個(gè)問題并且介紹了如何通過配置令它和all-or-nothing保護(hù)相關(guān)。最后,我們描述了一個(gè)簡單和常用的方法作為all-or-nothing保護(hù),以限制一個(gè)資源的。
通過安全限制保護(hù)資源
應(yīng)用或許被配置在一個(gè)安全限制中,而這個(gè)安全限制允許使用編程的方法根據(jù)用戶的角色來控制。資源可以被某些角色的用戶,并且禁止其它的角色。另外,某個(gè)視圖的一部分也可以根據(jù)用戶的角色來限制。
【J2EE表現(xiàn)層設(shè)計(jì)思考核心】相關(guān)文章: