Session的使用
- Session概述
- Session特性
- Session原理
- Session对象操作
- 获取Session对象-----getSession
- 获取SessionID------getId
- 向Session对象存储/修改数据-----setAttribute
- 获取数据------getAttribute
- 删除数据----removeAttribute
- Session对象失效
Session概述
Session对象,就是当浏览器向服务器发送请求建立连接后,由服务器创建的存储在服务器端的用于记录用户状态对象。
Session特性
- 服务器会为每个客户端连接分配一个Session对象,存储在服务器上;
- 同一个浏览器发送多次请求,同属于一次会话,共享同一个Session对象;
Session原理
Session原理:
- 当客户端浏览器(第一次)请求服务器时,服务器会为当前客户端连接创建一个Session对象,同时将sessionID通过Cookie响应给客户端,并存储在客户端;
- 当客户端端再次请求服务器的时候,会通过请求头携带存储sessionID的cookie,服务器接收请求之后获取cookie中的sessionID,通过这个sessionID获取第一次连接时创建Session对象。
Session对象操作
获取Session对象-----getSession
// session对象是 javax.servlet.http.HttpSession接口的对象
HttpSession session = req.getSession();
获取SessionID------getId
String sessionId = session.getId();
向Session对象存储/修改数据-----setAttribute
//session对象的底层就是一个map,可以存放多个键值对
//存储
session.setAttribute("key1","hello");
//修改
session.setAttribute("key1","hi");
获取数据------getAttribute
//从session对象中取数据,根据key获取value
String s1 = (String)session.getAttribute("key1");
System.out.println(s1);
删除数据----removeAttribute
//删除session中key1的键值对
session.removeAttribute("key1");
Session对象失效
一个客户端的多次请求正常情况下获取到的是同一个session对象,也是正式因为多次请求获取的是同一个session对象才实现了session中存储的用户状态可以作用于请求。
如果session失效,将会导致session失效的后的请求无法获取之前的session对象,也就是说多次请求获取的不是同一个session。
导致session失效的原因有2种:
- 客户端禁用Cookie,或者客户端在两次请求之间清除了cookie,将导致下一次请求无法获取上一次请求创建的Cookie;
- session是有生命周期的,当客户端请求服务器建立连接之后,服务器会为此会话创建session对象,如果客户端的两次请求时间间隔>session过期时间(默认30min),服务器会将之前创建的session对象销毁;
session失效解决方案:
- 如果客户端禁用了Cookie:不能通过cookie来记录、传递sessionId, 我们可以通过重写URL,使用url传递sessionID(在url上追加sessionId)
- 如果session过期:我们可以根据系统的需求灵活设置session的生命周期或者手动销毁session对象
//设置session对象的过期时间(单位:s)
//设置session过期时间10s:当客户端的两次请求时间>10s,session将会被销毁
session.setMaxInactiveInterval(10);
//手动销毁session对象
session.invalidate();