Servlet 04
会话跟踪 ( 状态管理 )
HTTP是无状态的协议. 我们客户端与服务器的每一次交流 ,服务器都没有记忆能力.
学习会话跟踪技术 , 可以让我们的服务器 在与客户端 的一场会话中, 拥有记忆能力.
存在两种技术实现:
1. Cookie : 将客户端与服务器交流时 产生的状态, 存储在客户端中.
2. Session : 将客户端与服务器交流时 产生的状态, 存储在服务器中.
Cookie ******
技术实现原理:
当服务器给浏览器响应时, 创建一个Cookie , 并将Cookie添加到响应头部.
浏览器根据HTTP协议约定, 接收到Cookie , 将Cookie存储在一个文本文件中(.txt).
当浏览器下一次访问 这个服务器时, 会将文本文件中的Cookie取出, 发送给服务器.
必须是相同的服务器 且 路径相同时才会发送.
创建Cookie
一个Cookie就是一个键值对. 在Java中是一个描述键和值的类.
创建对象的格式:
Cookie cookie = new Cookie(String key,String value);
注意: 在tomcat8.5版本之前, Cookie无法存储中文的.
将Cookie加入到 响应头部
格式:
response.addCookie(Cookie cookie);
注意: 如果同一个服务器 ,同一个路径存储的两个Cookie 的键相同, 则旧的Cookie 会被覆盖.
如果从 请求头 获取Cookie
格式:
Cookie[] cookies = request.getCookies();
注意: 如果从未存储过, 则获取的数组是null
Cookie的常用操作:
1. 取出Cookie中的键
String name = cookie.getName();
2. 取出Cookie中的值
String vlaue = cookie.getValue();
3. Cookie的存活时间问题
设置的格式:
cookie.setMaxAge(int 秒);
值的含义:
正数: 存活的秒数
负数: 默认值-1. 负数表示浏览器关闭时删除.
0 : 立即删除.
Cookie的路径问题
我们在使用Cookie时, 经常需要关注Cookie的路径问题.
为了避免此问题, 我们一般设置Cookie的路径为 /
格式:
cookie.setPath("/");
Cookie 的优缺点 *****
缺点:
1. Cookie存储的数据类型只能是String
2. 数据存储在了客户端的文本文件中, 不安全 .
3. 存储的数据大小 不能超过4kb
4. 在tomcat8.5版本之前 无法存储中文
5. 太依赖用户的浏览器设置, 用户可以主动删除Cookie 甚至禁用Cookie
优点:
数据存储在浏览器中, 减少了服务器的压力.
Session *****
HttpSession 可以看做一个Map集合, 存储的键是string , 存储的值是Object.
技术原理:
当浏览器访问服务器时, 服务器可以选择为浏览器创建一个新的HttpSession对象.
HttpSession对象被创建时, 会产生一个id , 我们称其为SessionID (Java程序员又称其为:JSESSIONID)
tomcat会自动将这个id 封装为一个Cookie , 将这个Cookie发送给浏览器.
当浏览器再次访问服务器时, 会携带这个包含id的cookie.
服务器接收到这个cookie后, 就取出id , 并根据这个id 找到对应的HttpSession对象 供程序员调用.
如何得到session对象
格式1. (推荐)
//内部代码是 调用了一参的getSession方法 , 传了一个true
HttpSession session = request.getSession();
格式2.
HttpSession session = request.getSession(boolean isNew);
参数:
true : 根据当前浏览器传来的sessionID 查找一个session对象, 并返回
如果sessionid不存在 , 则创建Session并返回
false : 根据当前浏览器传来的sessionID 查找一个session对象, 并返回
如果sessionid不存在 , 则返回null
#####session的常用方法
1. 设置 或 替换数据
session.setAttribute(String key,Object value);
2. 获取数据
Object value = session.getAttribute(String key);
3. 移除数据
session.removeAttribute(String key);
4. 销毁session
//我们使用此方法, 做的最多的事情就是 退出登录.
session.invalidate();
设置Session的销毁时长
服务器默认会话时长为30分钟 .
当浏览器最后一次访问30分钟后, 服务器删除对应的Session.
为了让session的存活时长, 更适用于我们的项目. 我们可以调整全局session时长 或 单独设置某个session的时长.
方式1.
设置全局的session时长.
独立环境:
修改tomcat/conf/web.xml
开发环境:
修改Servers项目中的 web.xml文件夹
更改web.xml中的session-config节点:
<session-config>
<session-timeout>分钟数字</session-timeout>
</session-config>
方式2.
设置某个项目的session时长
打开web-inf/web.xml , 加入如下节点:
<session-config>
<session-timeout>分钟数字</session-timeout>
</session-config>
方式3.
通过Java代码, 设置某一个session的存活时长.
session.setMaxInActiveInterval(int 秒);
Session 优缺点 *****
优点:
1. 数据存储在服务器中, 安全.
2. 数据存储类型为Object , 表示可以存储万物.
3. session存储的数据大小是 无限制的.
缺点:
数据存储在服务器中, 当用户量较大时, 极易耗尽服务器性能. 导致服务器崩溃.
Cookie 和 Session 的使用
我们学习Cookie和session 是为了让服务器有记忆能力.
需要存储数据时. 如果数据不是为了让服务器记住客户端, 那么还是要优先考虑数据库存储.
1. 打印HTML标签
- 判断是否存在cookie: 键:imgid1
存在: 打印红色心的 img标签
不存在: 打印黑色心的 img标签
- 判断是否存在cookie: 键:imgid2
存在: 打印红色心的 img标签
不存在: 打印黑色心的 img标签
2. HTML标签中, 使用超链接 向s2.do 发送参数 imgid
3. s2.do 接收参数imgid
4. 获取之前存储的所有的Cookie , 遍历比较Cookie的键
5. 根据比较的结果, 判断s2.do执行的逻辑 是 关注 还是 取消关注.
6. 关注: 创建Cookie ,存储30天
取消关注:创建Cookie , 存储0秒, 覆盖原30天的Cookie
7. 重定向到主页