Cookie&Session
# 会话(Session)
- 会话:一次会话中包含多次请求和响应。
- 一次会话:浏览器第一次向服务器发送请求会话建立,直到有一方断开为止。
- 作用:一次会话内的多次请求间,共享数据。
- 方式:
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
# Cookie(客户端会话技术)
# 1. 概念
将数据保存到客户端浏览器中。
# 2. 快速入门
使用步骤:
- 创建 Cookie 对象,绑定数据
new Cookie(String name, String value);
- 发送 Cookie 对象
response.addCookie(Cookie cookie);
- 获取 Cookie,拿到数据
Cookie[] cookies = request.getCookies();
# 3. 实现原理
基于响应头 Set-Cookie 与请求头 Cookie 实现。
# 4. Cookie 细节
# (1)是否可以发送多个 cookie?
- 可以,创建多个 Cookie 对象,调用多次 addCookie 即可。
# (2)Cookie 在浏览器中保存多久?
- 默认:浏览器关闭后销毁。
- 设置持久化:
cookie.setMaxAge(int seconds);
- 正数:写入硬盘文件,指定有效期;
- 负数:默认值(关闭浏览器销毁);
- 0:删除 cookie。
# (3)能否存中文?
- Tomcat8 之前:不支持,需 URL 编码;
- Tomcat8 之后:支持中文,但不支持特殊字符,建议仍使用 URL 编码。
# (4)Cookie 共享问题
同一 Tomcat 多 Web 项目之间
- 默认不能共享;
- 通过 setPath("/") 设置作用路径可共享。
不同 Tomcat 服务器之间
- 设置 setDomain(".baidu.com"),如:
- tieba.baidu.com
- news.baidu.com
- 一级域名相同,可共享 Cookie。
- 设置 setDomain(".baidu.com"),如:
# 5. Cookie 特点与作用
- 特点:
- 存在客户端;
- 单个大小限制(4KB),总数限制(20个);
- 作用:
- 存储少量非敏感数据;
- 无需登录识别客户端身份。
# 6. 案例:记住上次访问时间
# 需求:
- 第一次访问:提示“您好,欢迎您首次访问。”
- 再次访问:提示“欢迎回来,您上次访问时间为…”
# 分析:
使用 Cookie,判断是否存在 lastTime。
# 实现代码:
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
boolean flag = false;
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("lastTime".equals(name)) {
flag = true;
// 获取当前时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
str_date = URLEncoder.encode(str_date, "utf-8");
// 更新 Cookie
cookie.setValue(str_date);
cookie.setMaxAge(60 * 60 * 24 * 30); // 一个月
response.addCookie(cookie);
// 获取并解码 Cookie
String value = URLDecoder.decode(cookie.getValue(), "utf-8");
response.getWriter().write("\<h1>欢迎回来,您上次访问时间为:" + value + "\</h1>");
break;
}
}
}
if (!flag) {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = URLEncoder.encode(sdf.format(date), "utf-8");
Cookie cookie = new Cookie("lastTime", str_date);
cookie.setMaxAge(60 * 60 * 24 * 30);
response.addCookie(cookie);
response.getWriter().write("\<h1>您好,欢迎您首次访问\</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
# JSP 入门学习
# 1. 概念
- Java Server Pages:特殊的页面,支持 HTML 与 Java 代码混写。
# 2. 原理
- JSP 本质是 Servlet。
# 3. JSP 脚本元素
| 语法 | 说明 |
|---|---|
| <% 代码 %> | 写在 service 方法中 |
| <%! 代码 %> | 写在类成员位置 |
| <%= 代码 %> | 作为输出内容显示在页面中 |
# 4. JSP 内置对象
JSP 提供 9 个内置对象,常用的包括:
- request
- response
- out:字符输出流(out.write())
注意:response.getWriter() 输出优先级高于 out.write()。
# Session(服务器端会话技术)
# 1. 概念
- 使用服务器端 HttpSession 对象保存数据,支持会话期间共享。
# 2. 快速入门
HttpSession session = request.getSession();
session.setAttribute("key", value);
Object value = session.getAttribute("key");
session.removeAttribute("key");
# 3. 原理
- 底层通过 Cookie 存储 JSESSIONID 实现。
# 4. 细节
- 客户端关闭、服务器不关闭 → 默认不是同一个 Session
- 解决方法:
Cookie c = new Cookie("JSESSIONID", session.getId());
c.setMaxAge(60 * 60); // 1小时
response.addCookie(c);
- 服务器关闭、客户端不关闭
- 默认不是同一个;
- Tomcat 会:
- 钝化(持久化):关闭前序列化到硬盘;
- 活化(恢复):重启时恢复 session 对象。
- 销毁时机
- 服务器关闭;
- session.invalidate();
- 默认 30 分钟无操作失效,可在 web.xml 中配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
# 5. 特点
- 数据存在服务器,支持任意类型/大小;
- 更安全,无数量和大小限制。
# Cookie vs Session
| 对比项 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务器端 |
| 数据大小 | 最大 4KB 单个,20 个总数限制 | 理论无限制 |
| 安全性 | 低,易被篡改 | 高,不易篡改 |
# 案例:验证码登录
# 1. 需求
用户访问 login.jsp,输入用户名、密码、验证码。
- 验证码错误 → 返回登录页面,提示“验证码错误”
- 用户名/密码错误 → 返回登录页面,提示“用户名或密码错误”
- 全部正确 → 跳转至 success.jsp,提示“用户名,欢迎您”
# 2. 分析
验证码保存到 Session 中,登录时进行校验。
上次更新: 2025/07/23, 01:37:33