session的总结
session的工作原理
客户端提交表单,其中包含从cookie得到的sessionid,服务器根据这个sessionid,查找:
1、存在这个session对象,则判断是不是已经过期这个session对象,没有返回,否则,返回一个新的session对象
2、没有这个session对象,返回一个新的session对象
影响session生命周期的因素:
1、session的MaxInactiveInterval
2、session的invalidate
3、服务器是否启动。
【注意】与浏览器是否关闭没有关系
session的removeAttribute(String attrib)
------------------------------------------------------
当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-
Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie
JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为
了标识唯一的客户端用户,内容不会重复,这就是sessionid.
当浏览器得到这个sessionid会将它放在自己的进程内存里,这里不同的浏览器会有所不同,IE进程间不能共享这个sessionid,也就是新开一
个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在
请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.
可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个sessionid将消失,如果用户又打开浏览器想继续这次会话的时候,就会因
为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和
sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才
释放内存).
上面这种方式叫会话cookie,把cookie放在浏览器内存里,只能在这个浏览器的内存范围里完成会话,是一种不长久的方式,为了能长久会话,就出现
了持久化cookie,把cookie固化在用户的计算机上,现在的cookie不单单能存放sessionid,还能放用户信息,样式表信息等.
如果用户禁止了所有cookie的使用,那么会话cookie和持久化cookie都不能用了,有个方案也可以解决问题,就是URL重写,这里要说下的就
是URL重写只能实现会话cookie的效果,持久会话实现不了.
补充一点内容:客户端COOKIE又分为进程COOKIE和持久COOKIE,简单点说就是COOKIE要么保存在浏览器进程中,随浏览器关闭而消失,要
么保存在客户端本地文件中。具体采用哪种保存方式,由服务端决定。一般在SERVLET中使用javax.servlet.http.Cookie的
setMaxAge()来决定是进程COOKIE还是持久COOKIE。在TOMCAT中,TOMCAT创建了jsessionid这个COOKIE,并
且设置setMaxAge(-1),也就是说TOMCAT下jsessionid的COOKEI是进程COOKIE,在客户端本地是看不到这个
COOKIE文件的。