表現(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)記文件助手


歡迎大家訪問我的個(gè)人網(wǎng)站 萌萌的IT人