Servlet Session(会话)跟踪是用于在多个请求之间维护用户状态的机制,常用于用户登录、购物车等场景。本文将介绍如何在Servlet中使用Session进行状态管理。
目录
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. 部署与测试
部署
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar SessionServlet.java
- 将
.class
文件放入myapp/WEB-INF/classes/
。 - 将
session.html
放入myapp/
。 - 更新
web.xml
。 - 部署
myapp
到Tomcat的webapps
目录。 - 启动Tomcat。
测试
- 访问:
http://localhost:8080/myapp/session.html
- 输入用户名并提交:显示“登录成功”和Session ID。
- 刷新页面:显示“欢迎, [用户名]”。
- 点击“注销”:显示“已注销”,Session失效。
- 等待10分钟后刷新:Session过期,显示“欢迎”。
7. 参考资料
出站链接
- HttpSession API – 官方API。
- Java EE教程 – Session章节。
- Tomcat文档 – Session支持。
其他资源
- 《Head First Servlets and JSP》 – Session跟踪章节。
- X社区:搜索 #ServletSession 获取示例。
这篇指南展示了Servlet中Session跟踪的实现。如果需要更复杂功能(如URL重写支持Session或分布式Session),请告诉我!
发表回复