看看官方的定义:Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。这里会引发一个个问题,如下:

 

为什么需要session?

大家都知道HTTP是无状态协议,每一次请求都只会返相关的内容(HTML,图片,音频,视频==),并不会在服务器端留任何信息,当服务器需要记录用户的信息的时候,HTTP协议就无能为力了。比如记录用户登录的信息,因为不可能让用户每发送一个HTTP请求都需要提交帐号与密码吧!所以服务器需要用session来保存用户的信息。

 

怎样可以知道哪个SESSION是哪个用户的?

当用户发送一个请求的时候服务器怎样可以找到相应的SESSION,在这里我举了个小例子:

在工作室里边工作,有时会一大帮同事(十来个人吧)出去吃饭,大伙们多交流交流,无论生活上,还中情感上。可能经常去某饭店,老板见到这么一大帮人经常来光顾生意,心想肯定不想让这条大鱼流失,给他们打个折吧,老板想想,以后生意做大啦,我哪里记得住那么多人,于是就发了张优惠卡!有一天,工作室的头做了个大项目,赚了不少钱,这个当然要庆祝一个,team leader “走,咱们吃大餐去!”还是去那个间洒店,team leader点了很多菜,洒性大发”只吃饭,没酒怎么行呢?老板,来十瓶矛台!“,大家淅沥哗啦吃喝,到买单时候还有五瓶没喝完,这时老板走了过来,”要不把酒放小店这里,下次光临时再取出,我们会用一个专门的柜保管,现在重新发一个优惠卡,上有卡号,是用GUID生成的,肯定不会与别人重复,而且我卡号与柜子写到哈希表里边,还会记录贵客吃饭的次数,如果有优惠推出,肯定是先照顾熟客“。   老板可真够利害的,不尽能留住熟客,而且还能为熟提供酒,一举两得。

 

对于上面那个例子,用SEESION的里面的术语说说,那卡号就是sessionid,用GUID生成,服务器必须能识别每一个sessionID,就是要保证sessionid的唯一性,放到哈希表里边主要是能够快速地找到相信的session,需老板所以记录下信息就是session的内容(柜子号,吃饭的次数,消费的余额),如果是内容写在卡上就变成了COOKIE。

 

session到底怎样实现?

传说中就有那么几种方法,关键的问题就如何传送SESSIONID的问题。

(1)URL重写,在JSP中,每一个HTTP请求HTML文件都由servlet生成,在生成的期间修改超链接,FORM的ACTION路径,把sessionID附加上去,所说是说叫URL重定。但在JAVAEE中,只有JSP与servlet才可以,HTML文件是不能够进行URL生写。

(2)借用COOKIE,当然也可以把SESSIONID放到COOKIE中,当发送一个HTTP请求就从COOKIE里边取出。这种方式有限制,因为浏览器是可以禁止使用COOKIE。

(3)隐藏表单,服务器会自动把一个表单嵌入到HTLM中,把sessionID的值插入在表单中。

 

session机制方要实现方式的就这到几种,当然这样许多有趣的问题:

()