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