表現層設計需權衡安全、數據完整性、可管理性、擴展性。本文梳理 Session 管理、訪問控制、驗證策略、Helper 完整性等關鍵決策點,並列舉常見反模式及重構方向。
將狀態序列化嵌入 HTML(隱藏字段)或 Cookie。優點:實現簡單、無跨服務器複製問題。缺點:
結論:僅適用於極少量非敏感狀態;企業級應用不推薦。
Session ID 對應服務端內存/數據庫存儲,超時或手動失效前持久。優勢:無大小類型限制、天然安全、避免網絡開銷、支持靈活擴展。
集群環境下需解決 Session 複製:
<corePatterns:guard role="manager">)。利用 web.xml <security-constraint> 定義受保護 URL 模式與角色。若角色不分配給任何用戶,則實現「僅內部轉發可訪問,瀏覽器直接訪問 403」。
最簡方法:將敏感 JSP 放入 /WEB-INF/ 目錄,容器禁止直接訪問,但 RequestDispatcher 可內部轉發。
<jsp:setProperty name="helper" property="*"> 自動映射請求參數到 Bean 屬性。隱患:
解決:每請求重置 Bean 狀態,或手動清空未傳遞字段。
| 反模式 | 問題 | 重構方向 |
|---|---|---|
| 多視圖重複控制代碼 | Guard Tag 分散,維護困難 | 集中到 Controller + Command Helper |
| 暴露表現層數據結構給業務層 | HttpServletRequest 滲透業務層,耦合度高,非 Web 客戶端難復用 | 提取通用 DTO/參數對象傳遞 |
| 暴露表現層結構給領域對象 | 領域模型依賴協議細節,復用性受損 | 同理,傳遞純粹數據對象 |
| 允許重複表單提交 | 導致重複事務(重複扣款、發貨) | 同步器令牌模式 |
| 直接暴露敏感資源 | 配置、屬性、類文件可被直接下載 | 置於 /WEB-INF/、安全約束、隱藏映射 |
| 誤解 <jsp:setProperty> 行為 | 以為缺參會置 null,實則保留舊值 | 請求前主動初始化/重置 Bean |
| 臃腫控制器 | 邏輯堆砌,難測試、難維護 | 委派給 Command 對象,保持 Controller 輕量 |
表現層設計應遵循「集中控制、分離關注點、保護數據完整性、最小化耦合」。採用 Front Controller + Command + DTO 架構,配合聲明式安全與驗證框架,可構建健壯可維護的企業級 Web 應用。