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