核心原理
記錄每個用戶訪問信息(IP、用戶名、首次訪問時間、最近訪問時間、訪問次數、狀態),依據策略(如 10 秒內 10 次請求)判定惡意刷新,攔截後續處理並返回友好提示(如「請等待 60 秒後再刷新」)。
架構設計
- 純 JSP/Servlet 應用:實現 `Filter`,在 `doFilter` 中檢測,配置 `web.xml` 映射 `/*`。
- 框架應用:在框架入口引擎 (如 EasyJWeb `ActionServlet`) 直接調用檢測邏輯,或同樣用 Filter 實現。
核心組件
1. UserConnect (JavaBean)
封裝用戶訪問狀態:`userName`、`ip`、`firstFailureTime`、`lastLoginTime`、`failureTimes`、`status (0正常/-1鎖定)`。
2. UserConnectManage (監控線程 + 判斷邏輯)
- 靜態 `Map users` 緩存 (key=ip:userName)。
- 後台守護線程 `CheckTimeOut` 每 2 秒掃描:清理超時記錄、超過最大在線數 (默認 200) 時強制清理一半。
- 核心方法 `checkLoginValidate(ip, userName)`:
- 首次訪問創建記錄並啟動守護線程。
- 統計失敗次數,若在 `maxFailureInterval` (10s) 內超過 `maxFailureTimes` (10) → 鎖定返回 false。
- 鎖定狀態下等待 `waitInterval` (60s) 後自動重置計數器。
- 正常情況計數器+1 返回 true。
- 提供 `reset/remove/clear` 管理方法及參數動態調整 setter。
調用示例
if (!UserConnectManage.checkLoginValidate(request.getRemoteAddr(), "guest")) {
info(request, response, new Exception("您對頁面的刷新太快,請等待" + UserConnectManage.getWaitInterval()/1000 + "秒後再刷新頁面!"));
return;
}
擴展建議
高併發場景可引入數據庫/Redis 持久化用戶訪問信息;策略維度可增加 User-Agent、SessionID、請求路徑等特徵;集成日誌分析系統實現自動化封禁。