Servlet Session(会话)跟踪是用于在多个请求之间维护用户状态的机制,常用于用户登录、购物车等场景。本文将介绍如何在Servlet中使用Session进行状态管理。


目录

  1. Session 跟踪概述
  2. 创建和使用Session
  3. Session 属性操作
  4. Session 失效与销毁
  5. 完整示例
  6. 部署与测试
  7. 参考资料

1. Session 跟踪概述

  • 定义:Session 是服务器为每个客户端维护的一个临时数据存储区域,用于跟踪用户状态。
  • 实现:通过 HttpSession 对象,默认基于Cookie(JSESSIONID)。
  • 用途
  • 保存用户登录信息。
  • 跟踪用户行为。
  • 与Cookie对比:Session 数据存储在服务器端,更安全。

2. 创建和使用Session

获取Session

通过 HttpServletRequest 获取:

HttpSession session = request.getSession(); // 创建或获取现有Session
  • 如果没有Session,则创建新会话并返回。
  • request.getSession(false):若无现有Session,返回null。

Session ID

每个Session有唯一标识符:

String sessionId = session.getId();

3. Session 属性操作

设置属性

使用 setAttribute() 存储键值对:

session.setAttribute("username", "Alice");

获取属性

使用 getAttribute() 读取:

String username = (String) session.getAttribute("username");

删除属性

使用 removeAttribute()

session.removeAttribute("username");

4. Session 失效与销毁

设置有效期

  • 全局配置web.xml):
  <session-config>
      <session-timeout>30</session-timeout> <!-- 分钟 -->
  </session-config>
  • 代码设置
  session.setMaxInactiveInterval(1800); // 秒,30分钟

手动销毁

使用 invalidate()

session.invalidate(); // 销毁Session

5. 完整示例

以下是一个展示Session跟踪的Servlet。

HTML:session.html

<!DOCTYPE html>
<html>
<head><title>Session 测试</title></head>
<body>
    <form method="POST" action="/myapp/session">
        用户名: <input type="text" name="username"><br>
        <input type="submit" value="登录">
    </form>
    <a href="/myapp/session?action=logout">注销</a>
</body>
</html>

Servlet:SessionServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession(false);

        String action = request.getParameter("action");
        if ("logout".equals(action) && session != null) {
            session.invalidate();
            out.println("<h1>已注销</h1>");
        } else {
            String username = session != null ? (String) session.getAttribute("username") : null;
            out.println("<h1>欢迎" + (username != null ? ", " + username : "") + "</h1>");
            out.println("<p>Session ID: " + (session != null ? session.getId() : "无") + "</p>");
        }
        out.println("<a href=\"/myapp/session.html\">返回</a>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String username = request.getParameter("username");
        if (username != null && !username.trim().isEmpty()) {
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            session.setMaxInactiveInterval(600); // 10分钟
            out.println("<h1>登录成功: " + username + "</h1>");
        } else {
            out.println("<h1>请输入用户名</h1>");
        }
        out.println("<a href=\"/myapp/session.html\">返回</a>");
    }
}

配置:web.xml

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/session</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar SessionServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. session.html 放入 myapp/
  3. 更新 web.xml
  4. 部署 myapp 到Tomcat的 webapps 目录。
  5. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/session.html
  • 输入用户名并提交:显示“登录成功”和Session ID。
  • 刷新页面:显示“欢迎, [用户名]”。
  • 点击“注销”:显示“已注销”,Session失效。
  • 等待10分钟后刷新:Session过期,显示“欢迎”。

7. 参考资料

出站链接

其他资源

  • 《Head First Servlets and JSP》 – Session跟踪章节。
  • X社区:搜索 #ServletSession 获取示例。

这篇指南展示了Servlet中Session跟踪的实现。如果需要更复杂功能(如URL重写支持Session或分布式Session),请告诉我!