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)。