会话跟踪

HTTP协议是无状态无连接的, 我们客户端与服务器的每一次交流, 对于服务器来说都是没有记忆的!
会话就是多次的请求与响应!
关于状态管理, 提供了两种方式 !

  1. 将存储的状态, 管理在客户端: Cookie
  2. 将存储的状态, 管理在服务端: Session

服务器在向客户端响应时 , 使用Cookie消息头的方式 , 将存储的状态响应给浏览器
浏览器接收到Cookie 后 , 会将所有的Cookie存储在一个文本文件(.txt)里 , 当浏览器再次向同一个服务器发起请求时 ,浏览器会自动将这些Cookie以消息头的形式,发送给服务器

创建Cookie

过创建对象的方式, 得到一个Cookie , 并指定Cookie的键与值
Cookie cookie = new Cookie(String key,String value);

Cookie设置响应头

一次响应可以添加多个Cookie!
response.addCookie(Cookie cookie);

请求头中获取Cookie

因为存储的cookie可能是多个 ,所以得到的是一个数组
Cookie[] cookies = request.getCookies();

获取键的格式:
String name = cookie.getName();
获取值的格式:
String value = cookie.getValue();

注意:
如果未存储Cookie , 得到的是null!

调整Cookie的存活时长

cookie.setMaxAge(int 秒);//能存储的最大值为: int类型的最大值 !

  • 传入正数 : 表示倒计时的秒数
  • 传入0 : 表示立即删除此Cookie
  • 传入负数 : 默认为-1 , 负数表示会话结束时自动删除!
Cookie存储的路径
  • Cookie存在 替换 与 获取操作:

    Cookie的替换 只能由相同路径来完成 !
    Cookie的读取 只能由相同路径 或 子路经 可以读取!
    强调: 子路经设置的Cookie , 父路径是无法读取到的!

设计三个不同的Servlet:

请求地址分别为:

AServlet : /x/a
BServlet : /x/b
CServlet : /c

案例结果:
A存储:
B : 可读 , 可替换
C : 不可读 不可替换
C存储:
AB : 可读, 不可替换 !

注意:
建议在项目开发时, 将所有的Cookie路径 设置为 “/“

格式:
cookie.setPath(“/“);

Cookie的优缺点
  1. Cookie技术存储的数据类型有限制, 不可存储中文
  2. 数据存储在浏览器中 , 不安全, 不建议存储敏感数据
  3. 保存的数据大小 最大4KB
  4. 依赖于用户浏览器的Cookie设置, 用户可以勾选禁止Cookie

优点:
数据存储在浏览器中, 分散了服务器的压力 !

Session

基于Cookie实现的 ! Session是一个键值对的容器 !

原理:
浏览器访问服务器时, 服务器可以创建一个Session对象 (session是一个键值对的容器) !
每一个Session在创建时 , 会产生一个JSESSIONID , sessionid的值是唯一的 !
服务器在响应数据时, 会将Session的id 通过Cookie的方式 传递给浏览器 , 浏览器会存储到Cookie中 !
当浏览器再次访问此服务器时, 会将SessionID发送给服务器 , 服务器会自动寻找匹配的Session对象 , 当程序员使用Session的相关操作时, 操作的对象就是针对于这个SESSIONID的对象 !

获取Session

无参方法:
request.getSession(); 推荐使用
用来获取一个Session对象,内部的实现是调用了一参的方法, 传入了一个Boolean类型的值 true

有参的方法:
request.getSession(boolean isNew);
获取Session对象 , 参数的含义:
- 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分钟后, 没有再次连接, 就销毁会话 !
方式1.
通过修改tomcat的conf/web.xml 来完成默认tomcat会话时长的修改

数值分钟

方式2.
通过调用session 的方法, 修改单个session的时长
session.setMaxInactiveInterval(int 秒);

Session的优缺点

优点:
1. 数据存储在服务器中, 安全
2. session存储的数据类型是 Object
3. session存储的数据大小 理论上无限制!

缺点:
数据存储在服务器端, 用户量大时, 服务器压力较高!很容易耗尽服务器资源!