标签:
中文名称会话,Http客户端和Http服务器开始通信,就会产生会话,会话过程是可以连续的,也可以是时断时续的,它会有一个时间范围,表象就是你登录一个网站,如果长时间未登录,网站会提示你,这就是对session的一种应用。
JavaEE规范中,session被定义为一个具体的接口,javax.servlet.http.HttpSession,这个接口最终由符合 JavaEE规范的应用服务器来实现,如我们最常用的Tomcat、Weblogic、Websphere等,session通常是存储在服务器内存中的 (也有其它存储方式,但这里只讨论这种情况),也就是说session是服务器创建的,而不是浏览器创建的(刚开始学习时,老师经常这么说,可能也是为了 方便理解)。
从无到有,从有到无。
以Tomcat为例,当使用浏览器访问一个jsp时,Tomcat会先根据jsp生成java文件,再编译成class,最后运行,输出内容到浏览器, 浏览器解析呈现给用户。java和class文件会放到<Tomcat安装目录>/work/Catalina/localhost /<你的应用>/org/apache/jsp/<相应包>下,比如你有个test.jsp,那么就会生成 test_jsp.java文件。打开test_jsp.java,找到其_jspService方法,会看到声明了一些我们常说的jsp内置对象。
PageContext pageContext = null; HttpSession session = null; ServletContext application = null; JspWriter out = null;
再往下看,会看到有一句session = pageContext.getSession();,这里生成了session对象,也就是说,访问jsp时,服务器自动生成了session对象(可 以在jsp的page声明中加入session="false",禁用session)。
启动一个应用,访问一个jsp,这里以我本地的为例。
初次访问服务器上的一个jsp,服务器在响应头中设置了临时cookie,并加上了一JSESSIONID(毋庸置疑,肯定是服务器给加上的,Tomcat具体代码我没有去找)。
第二次访问jsp:
浏览器将存储JSESSIONID的cookie随着请求一起发送到服务器,服务器通过JSESSIONID到内存中找到上次生成的session对 象,从而实现客户端(浏览器)共享session。JSESSIONID也可以拼在url上,如http:///localhost:8080 /testApp/test.jsp;JSESSIONID=XXXXXXXXXXXX?param1=value1,JSESSIONID可以通过 request.getSession().getId()得到,url中如果有JSESSIONID,服务器就不会从cookie中取了。
注:浏览器多个tab之间(同一域下)共享session,实际上就是临时cookie都一样,JSESSIONID都是一个。而多个窗口之间使用不同的cookie不一样,所以不能共享session。
服务器被强制关闭,肯定啥都没有了,这要看服务器具体的实现,像Tomcat正常关闭(使用shutdown,而不是X掉)的话,是会对session序列化到硬盘上的,重新启动后,会读取,原有的session依然存在。
程序中调用session.invalidate(),销毁当前session方法。
session超时,超时指的是服务器连续一段时间内(超出了应用中设置的最低时限)没有接收到session所在客户端的请求,服务器从内存中移除该session对象。
老师通常这么告诉,很多书中也这样讲,真是偷换概念,大错特错,浏览器关闭后,只是对应服务器session的JSESSIONID消失了,而服务器再也用不到这个session,导致超时,服务器会自动销毁。
注:本文中讨论的session只是存储在服务器内存的情况,诸如其它放在Cache中、分布式存储、持久化神马的,还没接触,也就没研究。
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/13023425
标签:
原文地址:http://www.cnblogs.com/tianhai1610/p/4500783.html