市面上充斥「每日構建」「全自動測試」「接口導向設計」等泛泛之談。本文針對**技術架構師**視角,摒棄基礎工程規範,聚焦六大**實戰驗證、高誤區、高收益**的架構法則,附代碼級案例剖析。
// ❌ 服務端僅拼接字符串,無參數化、無驗證
String sql = "SELECT * FROM SecurityTable WHERE username = '"
+ request.getParameter("username")
+ "' AND password = '"
+ request.getParameter("password") + "'";
攻擊輸入:username = "admin'--" → SQL 變為 WHERE username = 'admin'--' AND password = ...,註釋掉密碼檢查,繞過登錄。
// ✅ PreparedStatement + 服務端業務規則校驗
String sql = "SELECT * FROM SecurityTable WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, validateUsername(request.getParameter("username"))); // 長度、字符集、格式
ps.setString(2, validatePassword(request.getParameter("password")));
結論:SSL、防火牆、客戶端驗證都無法替代服務端參數化查詢與業務規則校驗。
<%
if (user.hasRole("admin")) { %>
<a href="/admin/deleteUser">刪除用戶</a>
<% } %>
問題:授權邏輯分散在視圖層,難以審計、復用、單元測試。
@RolesAllowed("ADMIN") / Spring Security @PreAuthorize# ADR 001: 採用 PostgreSQL 替代 Oracle
## 背景: 成本、擴展性、雲原生支持
## 決策: 全面遷移至 PostgreSQL 13+
## 後果: 需重寫存儲過程、調整分區策略、團隊培訓
## 狀態: Accepted
| 法則 | 核心動作 | 反模式識別 |
|---|---|---|
| 服務端驗證 | 參數化查詢 + 業務規則校驗 | 僅靠 JS 驗證、拼接 SQL |
| 安全內建 | 聲明式授權 + 策略外部化 | JSP 混雜 if-role 判斷 |
| 異常統一 | 全局處理器 + 脫敏返回 | try-catch 打印堆棧給前端 |
| 無狀態會話 | JWT + Redis 共享 | HttpSession 存放購物車對象 |
| 數據訪問抽象 | Repository + 單測覆蓋 | Controller 寫原生 JDBC |
| 決策記錄 | ADR 版本化管理 | 口頭傳承、文檔缺失 |
這六條法則非理論構想,而是無數項目踩坑後的血淚結晶。**架構師不寫業務代碼,寫的是「約束」、「標準」與「決策記錄」**。將這些法則內化為代碼審查清單、CI 門禁規則、新人入職必讀文檔,才能真正發揮治理效能。下一期將深入「領域驅動設計在 J2EE 分層架構中的落地實戰」。