1. 概述

在本文中,我们将深入探讨 HttpServletRequest 接口中两个常见方法的区别:getSession()getSession(boolean)。看似相似,但在实际开发中稍不注意就会踩坑,尤其在会话控制较严格的场景下。

2. 核心区别

这两个方法的核心差异在于:当当前请求没有关联的 Session 时,是否自动创建一个新的 Session

request.getSession()
等价于 request.getSession(true)。它的行为是:

  • 如果已有 Session,返回当前 Session;
  • 如果没有,自动创建一个新 Session 并返回

request.getSession(false)
行为则完全不同:

  • 如果已有 Session,返回当前 Session;
  • 如果没有,返回 null,不会创建新 Session

🔑 简单粗暴记法:

  • 不带参数 or true → “有就拿,没有就造”
  • false → “有就拿,没有就算”

这个特性在需要判断用户是否已建立会话的场景非常有用,比如:

  • 用户是否已登录(避免无意义地创建 Session)
  • 第三方回调接口中防止 Session 泛滥
  • 高并发下控制资源创建

3. 实际示例

假设我们有一个用户信息更新流程:

  1. 用户先输入 userId 登录系统
  2. 随后提交 userNameage 更新资料

我们希望将用户数据暂存到 Session 中,并确保两次操作使用的是同一个 Session。

场景一:登录阶段,使用 getSession()

此时我们希望确保每个用户都有一个 Session,不存在就创建:

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
    
    HttpSession session = request.getSession(); // 无则创建
    session.setAttribute("userId", request.getParameter("userId"));
}

⚠️ 注意:这里调用 getSession() 后,无论之前有没有 Session,现在一定有一个可用的 Session 对象。

场景二:更新用户信息,使用 getSession(false)

此时我们只想为已登录用户更新信息,拒绝为未登录用户创建 Session

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
    
    HttpSession session = request.getSession(false); // 有则返回,无则 null
    
    if (session != null) {
        String userId = (String) session.getAttribute("userId");
        if (userId != null) {
            session.setAttribute("userName", request.getParameter("userName"));
            session.setAttribute("age", request.getParameter("age"));
        } else {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            response.getWriter().write("User not authenticated");
        }
    } else {
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        response.getWriter().write("No session exists");
    }
}

✅ 这样做可以有效避免:

  • 为非法请求创建无用 Session(浪费内存)
  • 防止 Session 劫持或伪造场景下误操作

4. 最佳实践建议

使用场景 推荐方式 说明
登录、初始化用户上下文 getSession() 确保 Session 存在
敏感操作(如修改密码) getSession(false) + 校验 防止空 Session 滥用
API 接口鉴权 getSession(false) 避免无谓创建 Session 影响性能
分布式 Session 环境 同上 减少不必要的分布式状态同步

5. 结论

getSession()getSession(true) 完全等价,适用于需要“强会话保障”的场景;而 getSession(false) 更适合用于“只读会话”或“条件性操作”,能有效避免不必要的 Session 创建,提升系统稳定性与安全性。

💡 小贴士:在高并发 Web 应用中,滥用 getSession() 可能导致大量空 Session 占用内存,建议在非必要场景使用 false 参数进行防御性编程。

完整示例代码已托管至 GitHub:
👉 https://github.com/baeldung/tutorials/tree/master/web-modules/javax-servlets


原始标题:Difference Between request.getSession() and request.getSession(true)