一、什么是 HttpSession

1. 前提:HTTP 无状态

HTTP 协议无状态、无记忆,每次请求都是独立的,服务器不会记住上一次用户信息。为了跟踪用户、保存登录状态、购物车、浏览记录,需要会话技术:

  • 客户端会话:Cookie
  • 服务端会话:HttpSession

2. HttpSession 定义

HttpSession服务器端会话对象

  • 数据保存在服务器
  • 针对同一个浏览器的多次请求共享数据
  • 生命周期:一次会话(打开浏览器访问项目 → 关闭浏览器 / 超时)

二、Session 底层执行原理(必考)

  1. 浏览器第一次访问 Servlet,服务器自动创建 HttpSession 对象,生成唯一标识:JSESSIONID
  2. 服务器通过 Cookie 把 JSESSIONID 发送给浏览器保存
  3. 浏览器后续每次请求,自动携带 JSESSIONID
  4. 服务器根据 JSESSIONID 找到该用户专属的 Session 对象
  5. 同一浏览器 = 同一个 Session;不同浏览器 = 不同 Session

核心:Session 底层依赖 Cookie 存储 JSESSIONID


三、HttpSession 获取方式

1. 常用获取方法

java

运行

// 有就获取,没有就自动创建(开发最常用)
HttpSession session = request.getSession();

// 有就返回,没有返回null,不会自动创建
HttpSession session = request.getSession(false);

2. 底层执行

  • 第一次请求:无 JSESSIONID → 新建 Session
  • 后续请求:携带 JSESSIONID → 匹配并获取已有 Session

四、HttpSession 核心常用 API(操作步骤)

1. 域对象:存、取、删数据(重点)

Session 是会话域对象,同一会话所有资源共享数据。

java

运行

// 1. 保存数据
session.setAttribute("username", "张三");
session.setAttribute("loginStatus", true);

// 2. 获取数据
Object name = session.getAttribute("username");

// 3. 删除单个数据
session.removeAttribute("username");

// 4. 销毁整个 Session(退出登录)
session.invalidate();

2. 会话有效期设置

java

运行

// 设置最大空闲时间(单位:秒)
// 超过时间无操作,自动销毁
session.setMaxInactiveInterval(60 * 30); 

3. 获取 Session 基础信息

java

运行

// 获取会话唯一标识 JSESSIONID
String id = session.getId();

// 判断是否为新会话
boolean isNew = session.isNew();

五、Session 完整使用步骤(固定 4 步)

场景:登录保存用户信息

步骤 1:获取 Session 对象

java

运行

HttpSession session = request.getSession();
步骤 2:存入用户数据

java

运行

session.setAttribute("user", "admin");
session.setAttribute("uid", 1001);
步骤 3:在其他 Servlet/JSP 获取数据

java

运行

HttpSession session = request.getSession();
String user = (String) session.getAttribute("user");
步骤 4:退出登录,销毁会话

java

运行

session.invalidate();

六、Session 生命周期

  1. 创建第一次调用 request.getSession() 且无 JSESSIONID 时创建。
  2. 存活浏览器不关闭、未超时、未手动销毁,一直存活。
  3. 销毁 三种方式
    • 手动销毁:session.invalidate();
    • 超时自动销毁:默认 Tomcat 30 分钟
    • 服务器正常关闭 / 项目卸载

七、Session 超时配置

方式 1:代码设置(局部)

java

运行

// 15分钟空闲失效
session.setMaxInactiveInterval(900);

方式 2:全局配置 web.xml(全局生效)

xml

<!-- 全局会话超时,单位:分钟 -->
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

八、实战案例:登录拦截 + 登录状态保存

1. LoginServlet(登录存入 Session)

java

运行

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 1. 获取账号密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 2. 模拟校验
        if("admin".equals(username) && "123456".equals(password)){
            // 3. 获取Session
            HttpSession session = request.getSession();
            // 4. 保存登录用户
            session.setAttribute("loginUser", username);
            // 重定向到主页
            response.sendRedirect("/index.jsp");
        }else{
            response.getWriter().write("账号密码错误");
        }
    }
}

2. Index 页面 / 其他 Servlet(判断是否登录)

java

运行

HttpSession session = request.getSession();
Object user = session.getAttribute("loginUser");

if(user == null){
    // 未登录,跳转登录页
    response.sendRedirect("/login.html");
}else{
    // 已登录,正常访问
    response.getWriter().write("欢迎:" + user);
}

3. 退出登录 Servlet

java

运行

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 获取session
        HttpSession session = request.getSession();
        // 销毁会话
        session.invalidate();
        // 跳转到登录页
        response.sendRedirect("/login.html");
    }
}

九、Session 特点总结

  1. 数据存服务端,安全性高;
  2. 可以存放任意类型对象,无大小限制;
  3. 依赖 Cookie 存储 JSESSIONID;
  4. 作用范围:一次会话(同一浏览器);
  5. 适合:登录状态、权限、购物车、临时用户数据。

十、Session 与 Cookie 核心区别(简答 / 背诵)

表格

特性CookieSession
存储位置客户端浏览器服务端
安全性低,可篡改
存储类型仅字符串任意对象
容量无限制
生命周期可自定义会话 / 超时
依赖依赖 Cookie
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐