由于HTTP协议的无状态特征,Web应用中经常使用Cookie和Session来保存用户与系统交互过程中的状态数据。
一、Cookie
Cookie指某些网站为了辨别用户身份、进行session跟踪而储存在本地终端上的数据,这些数据通常是经过加密的。服务器在响应请求时会将一些数据以“键-值”对的形式通过响应信息保存在客户端,当浏览器再次访问相同的应用时,就会将原先的Cookie通过请求信息带到服务器端。
Cookie是一小段文本信息,被保存在客户端。每次浏览器访问服务器的时候,会自动提交这段信息给服务器,服务器上的可执行程序就会获得这段信息,并且根据该信息进行相应的处理。
虽然Cookie可用于保持用户的会话状态,但将Cookie信息保存在客户端,存在较大的安全隐患,且一般浏览器对Cookie的数目及数据大小有严格的限制。所以在Web应用中,通常通过HttpSession对象来保持会话状态。
二、Session
Session对象的原理在于,服务器可以为客户端创建并维护一个Session对象,用于存放数据。在创建Session对象的同时,会为该Session对象产生一个唯一编号SessionID,并以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到原来的Session对象,并对其进行访问。需要注意的是,此时的Cookie中仅仅保存了一个SessionID,而相对较多的会话数据保存在服务器端对应的Session对象中,由服务器来统一维护,这在一定程度上保证了会话数据的安全性,但增加了服务器端的内存开销。
存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。从用户打开一个浏览器访问某个应用开始,到关闭浏览器为止的交互过程称为一个“会话”。在一个“会话”过程中,可能会向同一个应用发出多次请求,这些请求将会共享同一个Session对象,因为它们携带了相同的SessionID信息。
Session对象的正常使用要依赖于Cookie。如果客户端浏览器出于安全的考虑禁用了Cookie,就应该使用URL重写的方式使Session继续生效。Cookie禁用后,请求协议头中就不会携带SessionID的信息,但SessionID的信息会作为请求地址的一部分传到服务器端。response的encodeURL方法将根据浏览器是否不支持Cookie决定是否将SessionID信息写入链接地址。
Session对象的持久化 :Sessio对象的信息一般置于服务器的内存中,当服务器由于故障重启,或应用重新加载时,Session信息将会全部丢失。为了避免这种情况,将服务器的Session数据存放在文件系统或数据库中,这样的操作称为Session对象的持久化。Session对象在持久化时,存放在其中的对象以序列化的形式存放,因此存放在Session中的数据需要实现可序列化接口。
三、二者的区别
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。