HttpSession接口
介绍
HttpSession接口是Servlet规范下的子接口。存在于Tomcat中servlet-api.jar中。
如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户服务,此时借助于HttpSession对象进行数据共享。
(是类似于Cookie的!)
HttpSession与Cookie的区别
-
存储位置:
Cookie存放在客户端计算机(缓存或硬盘)
HttpSession存放在服务端计算机内存
-
数据类型:
Cookie对象存储共享数据类型只能是String类型
HttpSession对象可以存储任意类型的共享数据(Object)
-
数据数量:
一个Cookie对象只能存储一个共享数据(一个键值对)
HttpSession使用map集合存储共享数据,所以可以存储任意数量的数据。
-
参照物:
Cookie对象相当于【会员卡】
HttpSession对象相当于【存储柜】
命令实现
// 在同一个网站下,OneServlet向TwoServlet传送数据
OneServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// 1. 调用请求对象获取用户参数
String foodName = request.getParameter("foodName");
// 2. 调用请求对象,向Tomcat申请开辟session空间
HttpSession session = request.getSession();
// 3. 将数据添加到session
session.setAttribute("key1", 共享数据);
}
}
// 浏览器访问 /myWeb下TwoServlet
TwoServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// 1. 调用请求对象,向Tomcat申请开辟session空间
HttpSession session = request.getSession();
// 2. 从会话作用域对象得到OneServlet提供的共享数据
Object 共享数据 = session.getAttribute("key1");
}
}
Http服务器如何将用户与HttpSession关联
利用Cookie
getSession() 与 getSession(false)
getSession():当在服务端中存在了该用户的【储物柜】,tomcat将其直接返回;如果不存在,则创建【储物柜】
getSession(false): 当在服务端中存在了该用户的【储物柜】,tomcat将其直接返回;
如果不存在,tomcat会返回null,不会进行创建。
HttpSession的销毁时机
- 用户与HttpSession关联的时候,使用的cookie只能存放在浏览器缓存中。
- 在浏览器关闭时,意味着用户与其HttpSession断开联系。
- 由于tomcat无法检测浏览器何时关闭,因此在浏览器关闭时,并不会导致tomcat将浏览器关联的HttpSession销毁。
时,意味着用户与其HttpSession断开联系。 - 由于tomcat无法检测浏览器何时关闭,因此在浏览器关闭时,并不会导致tomcat将浏览器关联的HttpSession销毁。
- 为了解决这个问题,tomcat为每一个HttpSession对象设置【空闲时间】,默认为30min,若30min仍未操作,则会销毁。