首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JavaWeb Session 監聽器統計在線人數出現負數的邏輯漏洞修復

     編輯:程式設計疑難解答

問題代碼

public void sessionDestroyed(HttpSessionEvent event) {
    Integer num = (Integer) ctx.getAttribute("numSessions");
    if (num == null) num = 0; // 錯誤:未登錄用戶退出時 num 為 null 設為 0,再 -1 變 -1
    else num = num - 1;
    ctx.setAttribute("numSessions", num);
}

漏洞分析

用戶未登錄 (無 Session) 直接訪問退出頁面或超時,觸發 sessionDestroyed,但 numSessions 可能為 null 或 0,直接遞減導致負數。

修正

public void sessionDestroyed(HttpSessionEvent event) {
    ServletContext ctx = event.getSession().getServletContext();
    Integer num = (Integer) ctx.getAttribute("numSessions");
    if (num != null && num > 0) {
        ctx.setAttribute("numSessions", num - 1);
    } // else 不處理,保持 0 或 null
}

最佳實踐

  • 使用 AtomicInteger 避免併發競態。
  • 在 sessionCreated 中 incrementAndGet(),sessionDestroyed 中 decrementAndGet() 並配合 max(0, ...)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved