Head First Servlets & JSP 学习笔记 第六章 —— 会话状态

时间:2021-01-01 21:03:41

MVC中的M(模型),通常就是一个普通的类,这个类里面的信息就是业务逻辑。

会话(Session)

我们可以使用一个HttpSession对象,来保存横跨多个请求的会话状态。

HTTP协议使用的是无状态连接。客户浏览器与服务器建立连接,发出请求,得到响应,然后关闭连接。换句话说,连接只为一个请求/响应存在。对于Web容器而言,每一个连接都是一个新的客户。

那么Web容器怎么记住这是同一个客户,还是另外一个新客户呢?这个时候,客户就需要一个唯一的会话ID。

对于一个客户的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户。这个客户在以后的每一个请求中再把会话ID发到Web容器,这样,Web容器就可以区分不同的客户了。

那么又有一个问题:客户和Web容器怎么交换会话ID这个信息呢?答案就是:通过cookie。

 1 HttpSession session1 = request.getSession(); //无参数版本的getSession(),无论如何都会返回一个会话,要么是新建的,要么是之前就有的  2 if(session1.isNew()){
 3     syso("这是一个新创建的会话");
 4 else
 5     syso("这是一个已有的会话");
 6 
 7 HttpSession session2 = request.getSession(false); //有参数版本的getSession(),返回null或者一个之前就有的会话  8 if(null == session2)
 9     syso("这个会话不存在“);
10 else
11     syso("这是一个已有的会话");

那么又有一个问题:有些客户会禁用cookie,这怎么办?答案就是:URL重写。

也就是说,为了能识别是同一个客户还是新客户,需要交换会话ID,最简单的交换办法是用cookie,不行再用URL重写

删除不再需要的会话?会话对象占用着资源,Web容器怎么确定这个会话要不要删除?

会话有三种死法:①超时 ②主动调用invalidate()方法 ③应用结束

cookie实际上就是在客户和服务器之间交换的一小段数据(一个名/值对)。

1 Cookie cookie = new Cookie("username", "2bconfident"); //创建一个新的cookie对象 2 cookie.setMaxAge(30*60); //设置cookie在浏览器上存活的最大时间:30分钟

HttpSession的重要里程碑,一生中的重要时刻:创建和撤销会话。

前面的章节,我们知道在分布式应用上,有多个服务器,也就有多个JVM。一个JVM有一个ServletContext,一个JVM有多个Servlet,所以有多个ServletConfig,一个Servlet对应一个ServletConfig。

但是HttpSession对象,无论有多少JVM,一个应用中只有一个HttpSession对象,只有一个SessionID(会话ID)。