这一章主要讲HTTP的会话Session的管理;
1.Http协议是无状态的;
Http协议是无状态的
因此,http不保存各个用户之前发送过的请求/响应的记录;
2.什么是”会话”?
”会话”指的是:一段时间内,单个用户与Web应用之间一连串的交互过程;
会话是”某个用户操作”与Web服务器的”某个Web应用”之间的;(区分用户和Web应用)
若存在不同的用户/或者Web应用,则不是同一个”会话”;
注意:Session是对于一个Web应用,而不是一个页面;不同的浏览器访问同一个Web应用,则为不同会话;
3.会话的运作过程?
简单来说:
(1)用户第一次访问Web应用A,Servlet容器会在用户的HTTP请求的Cookies中找Session ID,找不到则新建一个HttpSession对象+对应的唯一Session ID,并且将Session ID写入response的Cookies发给客户端,记录在浏览器本地,这样,一次会话的”状态”就被”记录下来了”;
(2)下次,该用户再次访问Web应用A的其他页面,则这个用户的身份就会被Servlet根据请求Cookies中的Session ID查询内存,得到一个HttpSession对象,这个对象记录了一次”会话”;
4.HttpSession接口
什么时候会新建一个Session?
什么时候会新建一个Session?
5.一个关于JSP/Session的应用场景——记录登录状态
(1)第一次访问登录页面,输入用户名密码;Servlet先从session中读取username(“从cookies读取session ID,再去查询session”这一过程由Web自动实现),没有读到;则再从request里面读username,然后写入session;
(2)用户经过一些页面操作,再次访问登录页面;Servlet从session中读取到了username,则不作验证,即从request里面读username做验证(因为确定了用户身份),直接给与其”已登录状态”的权限;
(3)用户点击”注销登录”(或者关闭浏览器、或Session超时),session被销毁,下次打开浏览器访问登录页面需要重新做验证;
6.Servlet与Session
那么,如何在Servlet中使用Session呢?
Eg:
在JSP/Session中,JSP获得session利用了浏览器的Cookies中的Session ID(由Servlet容器自动实现)
如何解决?重写URL;
encodeURL方法的原理:
7.会话持久化
(1)节约内存;(大量的Session对象占内存)
(2)Web服务/单个Web应用重启时,能重启恢复当前Session;
因此,会话在其生命周期可能存在两种状态之间的转换:
8.会话的监听
包括Seesion的建立与销毁,绑定、修改、删除属性,被激活、搁置;服务器通过监听Seesion上发生的事件,可以用来如统计在线/登出用户的数量等;