JavaWeb 之 Session(会话) 总结
1. Session(会话)
Session 是一个会话级别的对象,一次会话对应一个HttpSession 对象。javax.servlet.http.HttpSession session,简称Session(会话)。
服务器会为每个用户创建一个Session,并存放在服务器端。
2. Session与Cookie 区别
Cookie 可以将会话状态保存在客户端,可以保存多个; Session 可以将会话状态保存在服务器端,保存重要信息,减少服务器资源浪费。
3. Session 的实现原理
思考:为什么当前会话的每一次请求可以获取到属于自己的会话对象?
-
打开浏览器,在浏览器上首次发送请求; 服务器会创建一个HttpSession 对象,该对象代表一次会话;同时生成HttpSession 对象和与之对应的Cookie 对象,并且Cookie 对象的name 是JSESSIONID,Cookie 的Value 是32位长度的字符串; 服务器将Cookie 的Value 和HttpSession 对象绑定到Session 列表中; Session 列表:在Web 容器中有一个Session 列表,用于维护大量的HttpSession 对象。 服务器将Cookie 完整发送给浏览器客户端; 浏览器客户端将Cookie 保存到缓存中,只要浏览器不关闭,Cookie 不会消失; 当再次发送请求时,会自动提交缓存当中的Cookie; 服务器接收到Cookie,验证该Cookie 的name 是JESSIONID,然后获取Cookie 的value; 通过Cookie 的value 去Session 列表中检索对应的HttpSession 对象。
原理图:
4. 代码
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Session
HttpSession session = req.getSession();
// 设置Session 的值
session.setAttribute("username","chengyu");
// 获取Session 的值
Object username = session.getAttribute("username");
// 获取SessionId
String id = session.getId();
System.out.println(id);
// 判断是不是新的Session
boolean aNew = session.isNew();
System.out.println(aNew);
// 手动注销Session
session.invalidate();
}
}
<session-config>
<!--5分钟后 Session自动失效-->
<session-timeout>5</session-timeout>
</session-config>
5. 使用场景
-
保存一个登陆用户的信息; 购物车信息; 在整个网站中经常使用的数据,保存在Session 中;
