Session与Cookie
一、Cookie
1. 什么是Cookie?
- 定义:Cookie是服务器发送到用户浏览器并保存在本地的一小块数据(键值对),每次请求同一服务器时会被携带回服务器。
- 核心作用:跟踪客户端状态,实现会话管理。
- 特点:
- 大小限制:单个Cookie不超过4KB,浏览器最多保存约300个Cookie。
- 不同浏览器不共享Cookie。
- 默认存储在内存中,关闭浏览器后失效。
2. Cookie的基本操作
(1) 服务器保存Cookie到客户端
通过HttpServletResponse
的addCookie
方法添加Cookie:
// Java示例:创建Cookie并设置有效期(24小时)
Cookie cookie = new Cookie("username", "txjava");
cookie.setMaxAge(24 * 60 * 60); // 存活时间(秒)
response.addCookie(cookie);
(2) 服务器读取客户端Cookie
通过HttpServletRequest
的getCookies
方法获取所有Cookie:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
System.out.println(c.getName() + ":" + c.getValue());
}
}
3. Cookie的生命周期
- 默认行为:Cookie保存在浏览器内存中,关闭浏览器即失效。
- 持久化Cookie:通过
setMaxAge(seconds)
设置存活时间:setMaxAge(3600)
:Cookie存活1小时,保存在硬盘。setMaxAge(0)
:立即删除Cookie。setMaxAge(-1)
:默认值,仅内存存储。
4. Cookie的路径(Path)
- 默认路径:Cookie的路径由请求的URL路径决定。例如,请求
/app/login
时,默认路径为/app
。 - 作用规则:访问子路径时,会携带父路径的Cookie,反之则不会。
- 手动设置路径:
cookie.setPath("/app"); // 硬编码
cookie.setPath(request.getContextPath() + "/"); // 动态设置
5. Cookie保存中文
由于Cookie不支持直接存储中文,需通过URL编码和解码处理:
// 编码保存
Cookie cookie = new Cookie("username", URLEncoder.encode("张三", "UTF-8"));
response.addCookie(cookie);
// 解码读取
String username = URLDecoder.decode(cookie.getValue(), "UTF-8");
6. 浏览器的Cookie管理
- 查看Cookie:通过浏览器开发者工具(如Chrome的
Application
面板)。 - 禁用Cookie:在浏览器设置中禁用后,大部分网站无法正常登录(Session依赖Cookie)。
二、Session
1. 什么是Session?
- 定义:Session是服务器端维护的会话对象,用于存储用户会话期间的数据。
- 核心作用:在多次请求间共享数据(如用户登录信息)。
- 生命周期:
- 创建:首次调用
request.getSession()
时生成。 - 销毁:用户关闭浏览器、Session超时(默认30分钟)或调用
session.invalidate()
。
- 创建:首次调用
2. Session的工作原理
- 依赖Cookie:服务器通过名为
JSESSIONID
的Cookie将Session ID发送给客户端。 - 流程:
- 客户端首次访问服务器,服务器创建Session并返回
JSESSIONID
。 - 后续请求携带
JSESSIONID
,服务器通过ID查找对应的Session对象。
- 客户端首次访问服务器,服务器创建Session并返回
3. Session与Cookie的区别
特性 | Cookie | Session |
---|---|---|
存储位置 | 客户端浏览器 | 服务器端 |
安全性 | 较低(易被篡改) | 较高 |
数据容量 | 小(4KB) | 大(受服务器内存限制) |
生命周期 | 可长期保存 | 浏览器关闭或超时后失效 |
依赖关系 | 无 | 依赖Cookie传递Session ID |
四、注意事项
- 安全性:
- 敏感信息(如密码)应加密存储。
- 避免在Cookie中直接存储用户隐私数据。
- 性能优化:
- 减少Session中存储的数据量。
- 设置合理的Session超时时间。
- 兼容性:
- 若客户端禁用Cookie,可通过URL重写传递Session ID。