5.4.1 什么是Session
虽然可以使用Cookie或URL请求参数在不同请求中传递信息,但如果传递的信息较多的话,将极大地降低网络传输效率和消耗网络带宽,同时也会增大在服务端程序的处理难度。就算这些都可以承受,使用Cookie或URL请求参数传递的信息量也是非常有限的。为此,在服务端的开发方案中提供了一种将用户会话中产生的大量信息保存在服务端的技术,这就是Session技术。
如果将Cookie比喻成商场里的会员卡,在会员卡里记录着顾客以前的消费累计金额和有效期限,那么就可以将Session比喻成银行卡,在银行卡中只保存了用户的帐号,而一些敏感信息以及很多的历史信息则保存在银行的服务器中,如密码、存款和取款记录、利率等。当储户在发生银行业务时,如取钱时,只需要提供银行卡(号),银行的系统就会通过银行卡中的帐号找到该用户的银行卡信息,在通过密码验证后,就可以进行正常的操作了,如提款、查询信息等。
从上面的描述可以知道,服务端Session保存了某个客户的一些信息(银行卡信息),但该客户必须提供一个Session标识(银行帐号)才可以锁定这个Session对象。在Web应用程序中,该Session标识实际上就是一个临时Cookie,对于Java Web程序来说,该临时Cookie的key是JSESSIONID,value是一个唯一标识Session的字符串,也被称为Session ID。正是由于Session ID在Web服务器和浏览器之间不断地传送,浏览器才能找到服务端以前为某个用户创建的Session对象。如果在新的浏览器窗口再次访问服务端程序,由于临时Cookie丢失,因此,在这个新的浏览器窗口也就无法再使用这个Session对象了。从表面上看好象是Session对象被删除,但实际上只是由于Session ID丢失从而导致Session对象的丢失(这就相当于银行卡丢失,从而导致和该银行卡相关的信息无法取到,但这些信息并未丢失,只要再次提供银行卡或正确的银行帐号,就可以找到这些信息)。