Java Web HttpSession 接口介绍
·
一、什么是 HttpSession
1. 前提:HTTP 无状态
HTTP 协议无状态、无记忆,每次请求都是独立的,服务器不会记住上一次用户信息。为了跟踪用户、保存登录状态、购物车、浏览记录,需要会话技术:
- 客户端会话:Cookie
- 服务端会话:HttpSession
2. HttpSession 定义
HttpSession 是 服务器端会话对象
- 数据保存在服务器
- 针对同一个浏览器的多次请求共享数据
- 生命周期:一次会话(打开浏览器访问项目 → 关闭浏览器 / 超时)
二、Session 底层执行原理(必考)
- 浏览器第一次访问 Servlet,服务器自动创建 HttpSession 对象,生成唯一标识:JSESSIONID
- 服务器通过 Cookie 把 JSESSIONID 发送给浏览器保存
- 浏览器后续每次请求,自动携带 JSESSIONID
- 服务器根据 JSESSIONID 找到该用户专属的 Session 对象
- 同一浏览器 = 同一个 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 生命周期
- 创建第一次调用
request.getSession()且无 JSESSIONID 时创建。 - 存活浏览器不关闭、未超时、未手动销毁,一直存活。
- 销毁 三种方式
- 手动销毁:
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 特点总结
- 数据存服务端,安全性高;
- 可以存放任意类型对象,无大小限制;
- 依赖 Cookie 存储 JSESSIONID;
- 作用范围:一次会话(同一浏览器);
- 适合:登录状态、权限、购物车、临时用户数据。
十、Session 与 Cookie 核心区别(简答 / 背诵)
表格
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端浏览器 | 服务端 |
| 安全性 | 低,可篡改 | 高 |
| 存储类型 | 仅字符串 | 任意对象 |
| 容量 | 小 | 无限制 |
| 生命周期 | 可自定义 | 会话 / 超时 |
| 依赖 | 无 | 依赖 Cookie |
更多推荐




所有评论(0)