Servlet编程专题7之HttpSession
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet编程专题7之HttpSession相关的知识,希望对你有一定的参考价值。
- Session,即会话,是Web开发中的一种会话状态跟踪技术。当然,前面所讲述的Cookie也是一种会话跟踪技术。不同的是Cookie是将会话状态保存在了客户端,而Session则是将会话状态保存到了服务器端。
- 那么,到底什么是“会话”?当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。
- Session并不是JavaWeb开发所持有的,而是整个Web开发中所使用的技术。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象的形式出现的。
1、Session的访问:
a、Session对象的创建:
javax.servlet.http.HttpServletRequest接口中有两个方法,getSession()方法和getSession(boolean create)方法:
- getSession()方法:用于返回与请求相关联的当前session,或者如果请求中没有session,创建一个并返回。
- getSession()方法:用于返回与请求相关联的当前session,或者传入的参数为true时,如果请求中没有session,创建一个并返回。(如果传入的参数为false时,不创建Session,返回null。)
2、对Session域属性空间的操作:
- Session是一个专门用于存放数据的集合,我们一般称这个用于存放数据的内存空间为域属性空间,简称为域。HttpSession中具有三个方法,是专门用于对该域属性空间中数据进行写、读操作的。
3、Session的工作原理:在服务器中系统会为每个会话维护一个Session。不同的会话,对应不同的Session。那么,系统是如何识别各个Session对象的?即是如何做到在同一个会话过程中,一直使用的是同一个Session对象的?
a、写入Session列表:
- 服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称之为Session列表。该Map的key为一个32位长度的随机串,这个随机串称之为JSessionID,value则为Session对象的引用。
- 当用户第一次提交请求时,服务器Servlet中执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。
b、服务器生成并发送Cookie:
- 在将Session信息写入Session列表之后,系统还会自动将“JSESSIONID”作为name,这个32位长度的随机串作为value,以Cookie的形式存放到响应报头中,并随着响应,将该Cookie发送到客户端中。
c、客户端接收并发送Cookie:
- 客户端接收这个Cookie后会将其存放到浏览器的缓存中。即,只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会失效。
- 当用户提交第二次请求时,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送给服务器
d、从Session列表中查找:
- 服务器从请求中读取到客户端发送来的Cookie,并根据Cookie的JSSESSIONID的值,从Map中查找相应key对应的value,即Session对象。然后,对该Session对象的域属性进行读写操作。
4、Session的失效:
- Web开发中引入的Session超时的概念,Session的失效就是指Session的超时。若某个Session在指定的时间范围内一直未被访问,那么Session将超时,即将失效。
- 在web.xml中可以通过<session-config>标签设置Session的超时时间,单位为分钟。默认Session的超时时间为30分钟。需要再次强调的是,这个时间并不是从Session被创建开始计时的生命周期长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长。
- 若未到超时时限,也可以通过代码提前使Session失效。使用
javax.servlet.http.HttpSession接口中的invalidate()方法:5、Cookie禁用后使用Session进行会话跟踪:
- 从前面Session的工作原理可知,服务器之所以可以针对不同的会话找到不同的Session,是因为Cookie完成了会话的跟踪。但是,若客户端浏览器将Cookie禁用,那么服务器还怎么保证同一会话使用的是同一个Session呢?
- 若客户端浏览器禁用了Cookie,会发现向服务器所提交的每一次请求,服务器在给出的响应中都会包含名称为JSESSIONID的Cookie,只不过这个Cookie的值每一次都不同。也就是说,只要客户端浏览器所提交的请求中没有包含JSESSIONID,服务器就会认为这是一个新的会话的开始,就会为其生成一个Map.Entry对象,key为新的32位长度的随机串,value为新创建的Session会话引用。这样的话,也就无法实现会话跟踪。
- 附加说明:
a、域属性空间范围对比:
- 在JavaWeb编程的API中,存在四个可以存放域属性的空间范围对象,这四个对象中所存储的域属性作用范围,由大到小分别为:
- ServletContext -> HttpSession -> HttpServletRequest -> PageContext
- ServletContext,即application,置入其中的域属性是整个应用范围的,可以完成跨会话共享数据。
- HttpSession,置入其中的域属性是会话范围的,可以完成跨请求共享数据。
- HttpServletRequest,置入其中的域属性是请求范围的,可以完成跨Servlet共享数据,但是这些Servlet必须在同一个请求中。
- PageContext,置入其中的域属性是页面范围的,不常用。
- 对于ServletContext,HttpSession,HttpServletRequest这三个域属性空间对象的使用原则是,在可以保证功能需求的前提下,优先使用小范围的。这样不仅可以节省服务器内存,还可以保证数据的安全性。
本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1976574
以上是关于Servlet编程专题7之HttpSession的主要内容,如果未能解决你的问题,请参考以下文章
Servlet编程专题2之获取ServletConfig对象