介绍:
- 来自于Servlet规范中接口。其实现类由Http服务器提供,tomcat提供的实现类在于servlet-api-jar 。
- 如果两个Servlet为同一个用户/同一个浏览器提供服务。此时这两个Servlet可以使用当前用户的HttpSession对象进行数据共享
- 开发人员习惯于将HttpSession对象称为【会话作用域对象】
http服务器如何将用户与HttpSession关联起来?
通过cookie
Cookie与HttpSession区别?【面试】
- 存放位置不同
Cookie 存储在客户端计算机的内存中或则硬盘上
HttpSession存储在服务端计算机的内存
2.存储数据量不同
一个Cookie对象只能存放一个共享数据
HttpSession对象可以存放任意数量的共享数据
3.存储数据类型不同
Cookie对象由于存放客户端计算机,保存共享数据只能是String
HttpSession对象存放服务端计算机,保存任意类型共享数据Object
4.参照物不同
Cookie----------------->用户在服务端得到一个 会员卡
HttpSession------------>用户在服务端得到一个 私人保险柜
HttpSession的工作原理
用户通过浏览器第一次访问OneServlet。
OneServlet在提供服务过程中要求,
Tomcat为当前用户开发一个【私人储物柜(HttpSession对象)】.Tomcat在创建这个HttpSessio对象时,生成一个唯一编号.这个编号称为session Id。
OneServlet工作完毕后。Tomcat将session Id作为一个Cookie对象 ('JSESSIONID',柜子编号)写入到响应头
然后浏览器在接收到响应包之后,将这个cookie保存在浏览器的内存中等到用户第二次来访问这个网站时,自动发送这个cookie对象此时提供服务的TwoServlet 就可以凭借柜子编号得到用户的私人储物柜并读取由OneServlet写入的共享数据
命令实现:
1.向Tomcat索要当前用户的私人储物柜
HttpSession session = 请求对象.getSession();
HttpSession session = 请求对象.getSession(false);
2.将数据存入到当前用户的私人储物柜作为共享数据
session.setAttribute("共享数据名",共享数据Object);
3.将数据从当前用户的私人储物柜读取出来
Object 共享数据 = session.getAttribute("共享数据名")
getSession() 与 getSession(false)区别?【面试】
1.getSession()
如果当前用户在服务端已经拥有了私人储物柜。此时直接将这个柜子返回Tomcat。
如果当前用户在服务端尚未拥有私人储物柜要求Tomcat,为当前用户创建一个新的私人储物柜返回。
2.getSession(false)
如果当前用户在服务端已经拥有了私人储物柜。此时直接将这个柜子返回Tomcat,
如果当前用户在服务端尚未拥有私人储物柜 此时要求Tomcat返回null
生命周期
- 用户第一次向Tomcat索要会话作用域对象时,由Tomcat负责生成
- 由于JSESSIONID只能存放在浏览器缓存中,所以在浏览器关闭时用户与自己的HttpSession对象失去联系
- 如果HttpSession对象空闲时间达到【最大空闲时间】,此时Tomcat认为当前用户放弃了自己的HttpSession,此时进行销毁处理。
HttpSession销毁方式
Tomcat在创建HttpSession对象时,自动设置一个【最大空闲时间】.如果这个HttpSession对象从上次使用完毕到现在空闲的时间达到【最大空闲时间】,上限,此时Tomcat负责将这个HttpSesion对象进行销毁。Tomcat默认设置最大空闲时间是30分钟。
最大空闲时间手动设置
30分钟等待时间,并不是所有的服务端计算机都能承受的。因此Tomcat允许开发人员自行设计较少的空闲时间。代码如下web.xml下
<session-config> <session-timeout>5</session-timeout><!--sesison过期时间以分钟为单位--> </session-config> |