1、 HTTP协议的无状态
当客户端向服务器发送一个请求后,服务器为每一个客户,创建一个唯一的标识符-ID号,并在响应的时候,把这个ID号发送给客户端浏览器。当浏览器再次发生请求的时候,同时也把这个ID号发送给服务器,那么服务器可以通过客户的ID来区分是哪个客户了。
2、 会话跟踪
2.1、什么是会话
在Java Servlet API中引入session机制来跟踪客户的状态。session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程(当前浏览器与服务器之间多次的请求、响应关系,被称为一个会话)。在一个session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
2.2、如何进行会话跟踪
在Servlet API中定义了javax.servlet.http.HttpSession接口,Servlet容器必须实现这个接口。当一个session开始时,Servlet容器创建一个HttpSession对象,并同时在内存中为其开辟一个空间,在HttpSession对象中可以存放客户状态的信息(例如:购物车)。Servlet容器为HttpSession分配一个唯一标识符,称为SessionID。Servlet容器把SessionID保存在客户的浏览器中。每次客户发出HTTP请求时,Servlet容器可以从HttpRequest对象中读取SessionID,然后根据SessionID找到相应的HttpSession对象,从而获取客户的状态信息。
2.3、会话的创建和使用
会话的创建
Servlet中的HttpRequestServlet对象为我们提供了两种创建和获取HttpSession对象的方法。
(1)HttpSession session = request.getSession(Boolean value);
(2)HttpSession session = request.getSession();
在第1种方法中,布尔值为true时,如果存在与当前请求关联的会话,就返回该会话。否则创建一个新会话,并把该会话返回。布尔值为false时,如果存在与当前请求关联的会话,就返回会话,否则返回null,不再创建会话。
第2种方法等同于第1种方法中的布尔参数值为true时的情况。
会话的使用
在javax.servlet.http.HttpSession接口中定义的方法,最常用的是有关进行数据存取的方法。
session.setAttribute(String name,Object value);
session.getAttribute(String name);
setAttribute(String name,Object value)是把一个对象value保存在HttpSession对象中,并为其指定引用名称为name,当我们想使用已经存储在sesion中的数据时,我们可以使用sesion.getAttribute(String name)方法,把数据取出来。其中name为我们在存入数据时,指定的引用名称。
注意:session.getAttribute(String name)方法的返回值是Object类型,所以在取出数据时,我们要对其进行数据类型转换,而且必须与我们存入的数据类型一致。
例如:String value = (String)session.getAttribute(“xinxin”);
2.4、HttpSession对象的存在周期
2.4.1、HttpSession对象的创建
当客户端浏览器第一次访问服务器时,服务器为每个浏览器创建不同的HttpSession对象。在服务器端使用request.getSession()方法来获得HttpSession对象,并以此来使用HttpSession接口为我们提供的方法。
2.4.2、HttpSession对象的使用
在创建HttpSession对象后,使用该对象进行数据的存取,以进行数据的传递。在此过程中我们常用的方法如下。
void setAttribute(String name,Object value):进行数据的保存。
Object getAttribute(String name):进行数据的读取。
2.4.3、HttpSession对象的结束
在以下情况下,session会结束
(1)、关闭浏览器,关闭session。
(2)、调用HttpSession的invalidate()方法,删除HttpSession对象和数据。
(3)、两次访问时间间隔大于session定义的非活动时间间隔。
例如:隔多长时间自动销毁session对象:
session.setMaxInactiveInterval(秒);
在session结束时,服务器会清空当前浏览器相关的数据信息。
3、 HttpSession技术不属于HTTP协议范围内,它是因为HTTP协议不能满足对用户的跟踪而产生的一种技术,它是由Web容器为程序提供的服务。
session是由服务器也就是Web容器创建的,我们使用request.getSession()来获取HttpSession对象。使用session.setAttribute()进行数据的保存,而使用session.getAttribute()来获得session内已保存的值。
4、 Serializable(序列化)接口,序列化的好处。
Java语言为我们提供了一种序列化机制,可以把一个实现了Serializable接口的对象转换成一组byte数据,在用到这个对象的时候,能把这些byte数据恢复出来,重新构建哪个对象。
程序在运行时,会产生对象,这些对象会随着程序的停止而消失,但是我们想把这些对象保存下来,让这些对象在程序运行终止后,仍然存在,可以让程序再次运行时读取这些值,或者在其他程序中利用这些保存下来的对象,在这种情况下,我们可以使用序列化来完成。
5、 在使用session进行数据存储的时候,要考虑该数据是否合适被存入session中,如果是当前用户经常使用的数据,则可以存入session中,如果用户只用了一次,不再使用或者是偶尔才会使用的数据,则不要存入session中,因为这样会增加系统资源的浪费。
6、 在Web项目中使用session,是为了跟踪用户状态,并区分不同的用户。
7、 会话是Web容器创建的,而不是由程序员编码创建的。当客户端浏览器第一次访问服务器时候,服务器为客户创建一个session。