看看官方的定义: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机制方要实现方式的就这到几种,当然这样许多有趣的问题:
()