编程自学指南:java程序设计开发,Servlet 中的会话管理基础知识
一、课程信息
学习目标
- 理解会话管理的概念和作用。
- 掌握 Cookie 和 Session 两种会话管理机制的原理和使用方法。
- 学会在实际项目中运用会话管理解决问题。
二、课程导入
生活实例引入
想象你去超市购物,进入超市时会领取一个购物篮,在购物过程中,你把挑选的商品放入购物篮,直到结账离开超市。这个购物篮就像我们在 Web 应用中的会话,它可以记录你在一次购物过程中的相关信息。在 Web 应用里,用户从访问网站开始,到关闭浏览器结束,这期间的一系列交互操作就构成了一个会话,我们需要一种方式来管理这个会话中的数据,这就是会话管理。
提问引导
让学生思考在日常生活中还有哪些类似需要记录信息的场景,引导他们将这些场景与 Web 会话管理联系起来。
三、会话管理概述
会话的概念
会话是指在一段时间内,客户端与服务器之间的一系列交互过程。在 Web 应用中,一个用户从首次访问网站开始,到关闭浏览器或会话超时结束,这期间的所有请求和响应就构成了一个会话。
会话管理的作用
- 保持用户状态:例如用户登录后,在整个会话期间保持登录状态,方便用户进行后续操作。
- 记录用户行为:如记录用户在网站上的浏览历史、购物车信息等。
- 提高用户体验:根据用户的会话信息,为用户提供个性化的服务。
HTTP 协议的无状态性
HTTP 协议是无状态的,即服务器无法识别不同请求是否来自同一个客户端。这就需要会话管理机制来弥补这个缺陷,以便服务器能够跟踪和管理客户端的会话。
四、Cookie 会话管理
Cookie 的概念
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它可以在客户端和服务器之间传递,用于在客户端存储会话信息。
Cookie 的工作原理
- 客户端向服务器发送请求。
- 服务器在响应中包含一个或多个 Cookie。
- 客户端浏览器接收到响应后,将 Cookie 保存到本地。
- 后续客户端再次向服务器发送请求时,会在请求头中包含之前保存的 Cookie。
- 服务器接收到请求后,从请求头中读取 Cookie 信息,根据 Cookie 中的数据进行相应的处理。
Cookie 的使用示例
创建和发送 Cookie
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/createCookie")
public class CreateCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建一个 Cookie 对象
Cookie cookie = new Cookie("username", "john");
// 设置 Cookie 的有效期为 1 小时
cookie.setMaxAge(3600);
// 将 Cookie 添加到响应中
response.addCookie(cookie);
response.setContentType("text/html");
response.getWriter().println("Cookie 已创建");
}
}
读取 Cookie
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/readCookie")
public class ReadCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
response.getWriter().println("用户名: " + cookie.getValue());
}
}
} else {
response.getWriter().println("没有找到 Cookie");
}
}
}
Cookie 的优缺点
优点
- 客户端存储:减轻服务器的存储压力。
- 可持久化:可以设置 Cookie 的有效期,实现数据的持久化存储。
缺点
- 安全性低:Cookie 数据存储在客户端,容易被窃取或篡改。
- 数据容量有限:每个 Cookie 的数据容量一般不超过 4KB。
- 影响性能:每次请求都会携带 Cookie,增加了请求的大小,影响性能。
五、Session 会话管理
Session 的概念
Session 是服务器端的会话管理机制,它为每个客户端分配一个唯一的会话 ID,服务器通过这个会话 ID 来跟踪和管理客户端的会话。
Session 的工作原理
- 客户端首次访问服务器时,服务器会为该客户端创建一个新的 Session 对象,并生成一个唯一的会话 ID。
- 服务器将会话 ID 通过 Cookie 或 URL 重写的方式发送给客户端。
- 客户端再次向服务器发送请求时,会携带会话 ID。
- 服务器根据会话 ID 找到对应的 Session 对象,从而获取该客户端的会话信息。
Session 的使用示例
创建和使用 Session
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/createSession")
public class CreateSessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取或创建 Session 对象
HttpSession session = request.getSession();
// 向 Session 中存储数据
session.setAttribute("userRole", "admin");
response.setContentType("text/html");
response.getWriter().println("Session 已创建,用户角色: " + session.getAttribute("userRole"));
}
}
获取 Session 数据
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/getSessionData")
public class GetSessionDataServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
// 获取 Session 对象
HttpSession session = request.getSession(false);
if (session != null) {
String userRole = (String) session.getAttribute("userRole");
if (userRole != null) {
response.getWriter().println("用户角色: " + userRole);
} else {
response.getWriter().println("Session 中没有用户角色信息");
}
} else {
response.getWriter().println("没有有效的 Session");
}
}
}
Session 的优缺点
优点
- 安全性高:Session 数据存储在服务器端,不易被窃取或篡改。
- 数据容量大:可以存储更多的数据。
缺点
- 服务器压力大:需要服务器维护大量的 Session 对象,增加了服务器的负担。
- 会话过期管理复杂:需要合理设置会话的有效期,避免资源浪费。
六、Cookie 和 Session 的比较与选择
比较
比较项 | Cookie | Session |
---|---|---|
存储位置 | 客户端 | 服务器端 |
安全性 | 低 | 高 |
数据容量 | 有限(一般不超过 4KB) | 较大 |
性能影响 | 每次请求携带 Cookie,增加请求大小 | 服务器维护 Session 增加负担 |
选择原则
- 安全性要求高:选择 Session,如用户登录信息、支付信息等。
- 数据量小且对性能要求高:可以考虑使用 Cookie,如记住用户的偏好设置。
- 需要持久化存储:可以结合使用 Cookie 和 Session,如使用 Cookie 存储会话 ID,使用 Session 存储具体的会话数据。
七、课堂练习
练习一
编写一个 Servlet,使用 Cookie 记录用户的访问次数,每次用户访问页面时,将访问次数加 1 并显示在页面上。
练习二
编写一个简单的用户登录系统,使用 Session 来管理用户的登录状态。当用户登录成功后,将用户信息存储在 Session 中,在后续的页面中可以验证用户是否已登录。
八、课程总结
知识回顾
- 回顾会话管理的概念和作用。
- 总结 Cookie 和 Session 的原理、使用方法、优缺点以及适用场景。
口诀总结
- “会话管理很重要,用户状态要记牢。Cookie 存客户端,大小有限安全糟。Session 放服务器,容量较大更可靠。根据需求来选择,Web 应用性能高。”
九、课后作业
作业一
完善课堂上的用户登录系统,增加用户注销功能,当用户点击注销按钮时,销毁 Session 并跳转到登录页面。
作业二
研究并尝试使用 Cookie 和 Session 结合的方式,实现一个简单的购物车功能,用户可以添加商品到购物车,购物车信息在不同页面之间保持同步。