作者:mobiledu2502855907 | 来源:互联网 | 2023-09-25 15:43
一、sessionsession,中文经常翻译为会话,其基本的含义是指有始有终的一系列动作或消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以被称为一个session;
一、session
session,中文经常翻译为会话,其基本的含义是指有始有终的一系列动作或消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以被称为一个session;有时候我们可以看到这样的话“在一个浏览器会话期间,......”,这里的会话一词用的就是其本意,是指从一个浏览器窗口打开到关闭的这个期间。
当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这两个含义,“面向连接”指的是在通信之前要建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在把信发出去的时候你并不能确定对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以相互依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类例子有“一个TCPsession”或者“一个POP3 session”。
而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。有时候session也用来指这种解决方案的存储结构,如“把XXX保存在session里”、由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session。
在本文中,使用中文“浏览器会话期间”来表达含义,使用“session机制”来表达含义,使用“session”表达含义,使用具体的“HttpSession"来表达含义。
二、HTTP协议与状态保持
HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要记录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样,不会有专人记录。
然而聪明的人们很快发现如果能够提供一些按需生成的动态信息会使得web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范(WEB服务器运行时外部程序遵循的规范)以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、COOKIE这些特性。其中COOKIE的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。
举例说明COOKIE和session机制之间的区别与联系。曾有一家咖啡店有喝5杯免费赠送一杯的优惠,然而一次性点满5杯的几乎微乎其微,这时就需要用某种方式来记录某位顾客的消费数量。以下分出几种方案:
1.该店店员记忆过人,能记住每位顾客消费的数量,只要顾客一走进咖啡店,店员就知道该怎么对待。这种做法就是协议本身支持状态。
2.发送给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在服务器端保持状态(短暂可以理解为COOKIE)。
3.发送给顾客一张会员卡,除了卡号之外什么信息也不记录,一般还会有期限。每次消费时,如果顾客出示会员卡,则店员在店里的记录本上找到这个卡号对应的记录添加一些消费信息。这种做法就是在服务器端保持状态(短暂理解为session)。
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说COOKIE机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助COOKIE机制来达到保存标识的目的,但实际上它还有其他选择。
感谢作者:郎云鹏。