会话技术
1. 会话: 一次会话中包含多次请求和响应。
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,知道有一方断开为止
2. 功能:在一次会话的范围内多次请求间,共享数据
3. 方式:
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
Cookie
1. 概念:
- 客户端会话技术,将数据保存到客户端
2. 快速入门:
使用步骤:
1. 创建Cookie对象,绑定数据
new Cookie(String name, String value)
2. 发送Cookie对象
response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
Cookie[] request.getCookies()
3. 实现原理:
- 基于响应头set-cookie 和请求头 Cookie 实现
4. cookie 的细节
1. 一次可不可以发送多个Cookie?
- 可以创建多个Cookie对象,使用response调用多次addCookie方法发送Cookie 即可
2. Cookie 在浏览器中保存多长时间?
- 默认情况下,当浏览器关闭后,Cookie数据被销毁
- 持久化存储:
- setMaxAge(int seconds)
- 正数:将Cookie 数据写到硬盘的文件中。持久化存储。Cookie存活的秒数
- 负数:默认值
- 零:删除Cookie信息
- setMaxAge(int seconds)
3. Cookie 能不能存中文?
- 可以,但不支持特殊字符,建议用URL编码
4. Cookie 共享问题?
假设在一个 tomcat 服务器中,部署了多个 web 项目,那么在这些 web 项目中 cookie 能不能共享
- 默认情况下不能共享
- setPath(String path): 设置 cookie 的获取范围。默认情况下,设置当前的虚拟目录
- 如果要共享,则可以将 path 设置为”/“
- setPath(String path): 设置 cookie 的获取范围。默认情况下,设置当前的虚拟目录
- 默认情况下不能共享
不同的 tomcat 服务器间 cookie 共享问题?
- setDomin(String path): 如果设置一级域名相同,那么多个服务器之间 cookie 可以共享
- setDomin(“.baidu.com”), 那么tieba.baidu.com 和 news.baidu.com 中 cookie 可以共享
- setDomin(String path): 如果设置一级域名相同,那么多个服务器之间 cookie 可以共享
5. Cookie 的特点和作用
1. 特点
- cookie 存储数据在客户端浏览器
- 浏览器对于单个 cookie 的大小有限制(4kb) 以及 对同一个域名下的总 cookie 数量也有限制(20个)
2. 作用
- cookie 一般用于存储少量不太敏感的数据
- 在不登陆的情况下,完成服务器对客户端的身份识别
6. 案例
- 记住上一次访问时间
1. 需求
- 访问一个 Servlet, 如果是第一次访问,则提示:您好,欢迎您首次访问。
- 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
2. 分析
- 可以采用 Cookie l来完成
- 在服务器中的 Servlet 判断是否有一个名为 lastTime 的 Cookie
- 有:不是第一次访问
- 响应数据:欢迎回来,您上次访问时间是:lastTime=2023年1月1日11:11:11
- 写回 Cookie : lastTime=2023年1月1日11:11:11
- 没有:是第一次访问
- 响应数据:您好,欢迎您首次访问
- 写回 Cookie : lastTime=2023年1月1日11:11:11
- 有:不是第一次访问
Session
1. 概念
- 服务器会话技术,在一次会话的多次请求见共享数据,将数据保存在服务器端的对象中。HttpSession
2. 快速入门:
1. 获取HttpSession对象:
- HttpSession session = request.getSession();
2. 使用HttpSession对象:
- Object getAttribute (String name)
- void setAttribute(String name, Object value)
- void removeAttribute(String name)
3. 原理
- Session 的实现是依赖于Cookie 的
4. 细节:
1. 当客户端关闭后,服务器端不关闭,两次获取session是否为同一个?
默认情况下。不是。
如果需要相同,则可以创建Cookie, 键为JSESSIONID, 设置最大存活时间,让cookie持久化保存
Cookie c = new Cookie("JSESSIONID", session.getId()); c.setMaxAge(60*60); //存活1小时 response.addCookie(c);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
- 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
- session 的钝化:
- 在服务器正常关闭之前,将session 对象序列化到硬盘上
- session 的活化
- 在服务器启动后,将session 文件转化为内存中的session 对象即可
- session 的钝化:
3. session 什么时候被销毁?
服务器关闭
session 对象调用invalidate()。
session 默认失效时间 30分钟.
选择性配置修改
30</session - timeout> </session - config>
5. session 的特点
- session 用于存储一次会话的多次请求的数据,存在服务器端
- session 可以存储任意类型,任意大小的数据
session 与 Cookie 的区别
session 存储数据在服务器端,Cookie 在客户端
session 没有数据大小限制,Cookie 有
session 数据安全,Cookie 相对不安全
6. 案例:验证码
1. 案例需求:
1. 访问带有验证码的登录页面login.jsp
2. 用户输入用户名,密码以及验证码
- 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
- 如果验证码输入有误,跳转登录页面,提示:验证码错误
- 如果全部输入正确,则跳转主页success.jsp,显示:<用户名>, 欢迎您