表現層設計考慮
會話管理

  在客戶端保存會話狀態
  優點:
  ①實現容易
  ②保存狀態比較少時,效果好
  ③需要多臺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助手;使用標記庫;標記文件助手


歡迎大家訪問我的個人網站 萌萌的IT人