表現(xiàn)層設(shè)計(jì)考慮
會(huì)話管理 在客戶端保存會(huì)話狀態(tài) 優(yōu)點(diǎn):
①實(shí)現(xiàn)容易
②保存狀態(tài)比較少時(shí),效果好
③需要多臺(tái)Server實(shí)現(xiàn)負(fù)載均衡時(shí),無需在Server間復(fù)制會(huì)話狀態(tài)。
實(shí)現(xiàn)策略:
①HTML隱藏字段
②HTTP Cookie
③直接放進(jìn)URL里
1. HTML隱藏字段的缺點(diǎn):
①需保存狀態(tài)較多時(shí),缺點(diǎn)尤其明顯:系統(tǒng)性能下降;狀態(tài)在請(qǐng)求和響應(yīng)中都要通過網(wǎng)絡(luò)往復(fù)傳輸。
②保存的狀態(tài)只能是字符串形式的值,任何對(duì)象引用必須“字符串化”;加密處理。
2. HTTP Cookie的缺點(diǎn):
①同上
②同上;對(duì)于Cookie header的大小有限制,也就限制了能夠保存的數(shù)據(jù)量。
安全問題
在表現(xiàn)層保存會(huì)話狀態(tài) session ID
優(yōu)點(diǎn):
①狀態(tài)保存在Server,不會(huì)受到數(shù)據(jù)量大小或是數(shù)據(jù)類型方面的限制。
②會(huì)話狀態(tài)不會(huì)在每個(gè)請(qǐng)求中都通過網(wǎng)絡(luò)傳輸一次,系統(tǒng)性能不會(huì)受到影響。
③在Server保存會(huì)話狀態(tài),可以按照需要和代價(jià),在繁、簡間靈活選擇,兼顧可擴(kuò)展性和性能。
缺點(diǎn):
需要在集群的多個(gè)Server間復(fù)制會(huì)話狀態(tài)。
在業(yè)務(wù)層或資源層保存會(huì)話狀態(tài) || ||
EJB組件 關(guān)系型數(shù)據(jù)庫
控制客戶端訪問 保護(hù)視圖 策略:
①加入一種應(yīng)用邏輯
②配置運(yùn)行時(shí)系統(tǒng)
常見方法:
①采用一個(gè)控制器
②在視圖中直接加入保護(hù)
1.
在視圖內(nèi)部中實(shí)現(xiàn)保護(hù) a.
阻塞對(duì)整個(gè)資源的訪問 b.
只阻塞對(duì)局部資源的訪問 2.
每頁加入“要么全部 - 要么沒有”的保護(hù) 3.
加入對(duì)頁面局部的保護(hù) a.
根據(jù)用戶角色不顯示視圖的局部內(nèi)容 b.
根據(jù)系統(tǒng)狀態(tài)或錯(cuò)誤條件不顯示視圖的局部內(nèi)容 通過配置實(shí)現(xiàn)保護(hù) web.xml
1.
通過標(biāo)準(zhǔn)安全限制實(shí)現(xiàn)資源保護(hù) 2.
通過一個(gè)簡單、通用的配置實(shí)現(xiàn)資源保護(hù) 只需把那些限制訪問的資源放到Web應(yīng)用的/WEB-INF/目錄下即可。
重復(fù)的表單提交 同步器令牌(又名“時(shí)曾相識(shí)”令牌)
驗(yàn)證 客戶端+服務(wù)器端驗(yàn)證
在客戶端驗(yàn)證 JavaScript
在服務(wù)器端驗(yàn)證 1.
基于表單的驗(yàn)證 容易實(shí)現(xiàn),比較高效;應(yīng)用系統(tǒng)越大,造成的重復(fù)代碼越多。
2.
基于抽象類型的驗(yàn)證 從狀態(tài)中抽象出類型和限制信息,放入一個(gè)通用的框架中。
例如,可以使用一個(gè)組件或者一個(gè)子系統(tǒng)來封裝驗(yàn)證邏輯。
缺陷:
①效率、性能上可能具有潛在的損失;
②通用解決方案強(qiáng)大,但難于理解、不易維護(hù)。
助手類屬性——完整性和一致性 JavaBean助手類通常用于存放由客戶端請(qǐng)求傳來的中間狀態(tài)。
<jsp:setProperty name="helper" property="*"/>
當(dāng)請(qǐng)求中的參數(shù)值為空的時(shí)候,技術(shù)規(guī)范規(guī)定,不對(duì)該屬性的值做任何變化。
解決方案:
在多次請(qǐng)求之間重置JavaBean的所有狀態(tài)。
表現(xiàn)層不佳實(shí)踐多個(gè)視圖中都包括控制代碼 參照解決方案:
合并控制代碼,引入一個(gè)控制器和相關(guān)的命令助手。
Ch4,“引入控制器”、“隔離不同邏輯” Ch6,“命令與控制器策略”、“視圖助手”把表現(xiàn)層的數(shù)據(jù)結(jié)構(gòu)暴露給業(yè)務(wù)層 表現(xiàn)層的數(shù)據(jù)結(jié)構(gòu),例如
HttpServletRequest,應(yīng)該只限于表現(xiàn)層。
參照解決方案:
Ch4,“對(duì)業(yè)務(wù)層隱藏表現(xiàn)細(xì)節(jié)”把表現(xiàn)層數(shù)據(jù)結(jié)構(gòu)暴露給業(yè)務(wù)領(lǐng)域?qū)ο?/span>
參照解決方案:
同上
允許重復(fù)提交表單
參照解決方案:
需要監(jiān)管、控制請(qǐng)求流程。
Ch4,“引入同步器令牌”
把敏感資源暴露給客戶端的直接訪問
參照解決方案:
保護(hù)敏感資源、禁止客戶端直接訪問。
Ch4,“對(duì)客戶端隱藏資源”
假定<jsp:setProperty>會(huì)重置Bean屬性
參照解決方案:
記住<jsp:setProperty>的這種不太直觀的賦值機(jī)制,在使用bean屬性之前先做初始賦值。
創(chuàng)建出“胖控制器”
參照解決方案:
Ch4,“引入控制器”,Ch6,“命令與控制器策略”;
Ch4,“隔離不同邏輯”,Ch6,“視圖助手”
把視圖助手當(dāng)作Scriptlet使用
參照解決方案:
視圖中的Java Scriptlet;使用JSTL助手;使用標(biāo)記庫;標(biāo)記文件助手