会话跟踪 ( 状态管理 )
HTTP协议是无状态的 , 我们的服务器在与客户端进行交互时, 没有记忆.
两种方式来实现状态管理:
1. Cookie技术: 将状态 , 存储到客户端中
2. Session技术: 将id存储在客户端中, 将状态存储在服务器中.
Cookie技术
技术实现步骤以及原理:
1. 当服务器向客户端响应时 , 可以向响应头部加入Cookie , 每一个Cookie表示一个键值对.
2. 浏览器在接收到响应后, 如果存在Cookie , 则会将Cookie存储在文本文件中 (.txt)
存储时, 会存储的信息有: 服务器的域 , 路径 , Cookie键 ,Cookie的值, 存储时长...
3. 当浏览器向客户端请求时, 会遍历 Cookie的文本文件, 将匹配新请求地址的Cookie 携带上, 放在请求头部, 发送给服务器 !
Cookie匹配的规则:
当cookie存储的域相同时, 路径匹配时 才会将Cookie发送给服务器.
如何创建Cookie
Cookie在Java中的体现 就是一个表示键值对的 Java类, 类名为: Cookie .
格式:
Cookie cookie = new Cookie(String name,String value);
Cookie cookie = new Cookie(String name,String value);
cookie.setMaxAge(Integer.MAX_VALUE);
cookie.setPath("/");
response.addCookie(cookie);
如何将Cookie添加到响应头部
通过响应对象, 将Cookie添加到响应头部
格式:
response.addCookie(Cookie cookie);
一次响应, 可以添加n个cookie .
如果浏览器中已经存储过与某个Cookie的name相同的Cookie , 再次存储时会覆盖value
如何从请求头部 得到之前存储的所有Cookie
因为一个域 和 路径下, 可能存在多个Cookie , 所以获取的不是单个Cookie , 而是一个数组:
Cookie[] cookies = request.getCookies();
// 如果从未存储过, 则返回的数组值是 null
得到Cookie后, 如何取出其中的键和值.
获取Cookie的键:
String name = cookie.getName();
获取Cookie的值:
String value = cookie.getValue();
如何调整Cookie存储时长.
cookie.setMaxAge(int 秒);
传入的值:
- 负数 : 默认-1 , 表示浏览会话结束时 删除.
- 正数 : 存活的秒数, 例如: 60*60*24*365*10 表示十年.
- 0 : 经常用于覆盖一个cookie时使用, 作用为0秒后删除 (立即删除)
Cookie存储时, 路径问题的解决.
路径匹配的规则:
- Cookie的替换: 只能由相同域 , 相同路径的 完成替换.
- Cookie的获取: 只能由相同域 , 相同路径或子路经 获取
例如:
A地址: localhost/x/a.do
B地址: localhost/x/b.do
C地址: localhost/c.do
A存储数据时: a/b可以获取 ,a/b可以替换. c不能获取 也不能替换.
C存储数据时: a/b/c可以获取 , c可以替换.
Cookie的路径问题, 经常影响我们的开发 .
JavaWeb 给我们提供了一个Cookie的方法, 用于设置Cookie的路径.
通常我们会将cookie的路径设置为/ (根路径)
格式: cookie.setPath("/");
Cookie的优缺点:
缺点:
1. Cookie存储的数据类型有限制 , 只能是字符串
2. 数据存储的大小 ,有限制, 最大为4kb
3. 数据存储在用户的计算机上 , 不安全
4. 受限于用户的浏览器设置, 当浏览器禁止使用Cookie时 , cookie就无法再存储了.
优点:
数据存储在客户端 , 分散了服务器的压力.
Session技术 (会话)
基于Cookie实现的技术 , 是Java中的一个键值对的容器. 就像我们常用的Map集合.
技术原理:
1. 浏览器访问服务器时, 服务器可以选择创建Session对象.
2. session对象在创建时, 会生成一个id , 我们称其为sessionid , sessionid是Session的密钥, 是唯一的 !
3. session创建完毕后, 会自动将sessionid以cookie的形式 存储到用户的浏览器中.
4. 当浏览器再次访问服务器时, 会自动携带sessionid 发送给服务器.
5. 服务器得到sessionid后, 会去自动匹配找到对应的session对象, 供用户使用.
如何获取session对象
在Java中, session是一个Java对象, 对象的类型为: HttpSession
获取Session对象的格式:
格式1. 无参方法:
HttpSession session = request.getSession();
内部调用了 一参方法, 且传入true
格式2. 一参方法
HttpSession session = request.getSession(boolean isNew);
用于获取session 参数:
true: 根据当前浏览器传入的sessionid ,寻找session对象并返回 . 如果不存在 , 则创建新的session并返回
false: 根据当前浏览器传入的sessionid ,寻找session对象并返回 . 如果不存在 , 则返回null;
session的常用方法
1. 存储数据
session.setAttribute(String key,Object value);
2. 获取数据
Object value = session.getAttribute(String key);
3. 删除数据
session.removeAttribute(String key);
4. 销毁session (应用场景: 百分之99的情况是: 退出登录)
session.invalidate();
session的存活时长
session的默认时长为: 30分钟!
指的是: 举例用户的上一次访问大于30分钟后, session自动删除.
设置Session时长:
方式1. 修改单个session的时长:
session.setMaxInactiveInterval(int 秒);
方式2. 修改tocmat下, 所有session的默认时长:
独立环境: 寻找到tomcat/conf/web.xml文件
开发环境: 寻找到Servers项目中的 web.xml
修改web.xml中 session-config节点
<session-config>
<session-timeout>数值分钟</session-timeout>
</session-config>
session的优缺点
优点:
1. 数据存储在服务器中, 安全.
2. session存储时的值类型为: Object , 可以存储任意类型数据.
3. 可存储的数据大小, 理论上是无上限的.
缺点:
数据在服务器的内存中存储, 内存通常是有限的, 会对服务器造成大量的压力. 很容易耗尽服务器资源.
Cookie结束 和 Session技术 不是互斥的
Cookie和session是结合使用的.
通常:
对于安全不敏感的数据 . 建议使用Cookie存储
对于安全敏感的数据, 建议使用session存储
对于安全敏感, 且较大的数据, 存储在数据库.
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!