servlet——HttpSession

1.简介

    "会话”?当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。
    Session,是Web开发中的一种会话状态跟踪技术。Cookie是将会话状态保存在了客户端,而Session则是将会话状态保存到了服务器端。
    Session并不是JavaWeb开发所持有的,而是整个Web开发中所使用的技术。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象的形式出现的。

2. session的访问

2.1 创建

在httpServletRequest接口中

httpSession getSession()//用于返回与请求相关联的当前session,或者如果请求中没有session,创建一个并返回。
httpSession getSession(boolean create)//create为true时和getSession()功能一样,为false时不创建session

2.2 域属性

    Session是一个专门用于存放数据的集合。HttpSession中具有三个方法,是专门用于对该域属性空间中数据进行写、读操作的。

Object getAttribute(String name)
void removeValue(String name)
void setAttribute(String name,Object value)

3.session工作原理

    在服务器中系统会为每个会话维护一个Session。不同的会话,对应不同的Session。那么,系统是如何识别各个Session对象的?即是如何做到在同一个会话过程中,一直使用的是同一个Session对象的?

3.1 session列表

    服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称之为Session列表。该Map的key为一个32位长度的随机串,这个随机串称之为JSessionID,value则为Session对象的引用。
    当用户第一次提交请求时,服务器Servlet中执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。
在这里插入图片描述

3.2 服务器生成并发送cookie

    在将Session信息写入Session列表之后,系统还会自动将“JSESSIONID”作为name,这个32位长度的随机串作为value,以Cookie的形式存放到响应报头中,并随着响应,将该Cookie发送到客户端中。

3.3 客户端接收并发送Cookie

    客户端接收这个Cookie后会将其存放到浏览器的缓存中。即,只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会失效。
    当用户提交第二次请求时,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送给服务器

3.4 从Session列表中查找

    服务器从请求中读取到客户端发送来的Cookie,并根据Cookie的JSSESSIONID的值,从Map中查找相应key对应的value,即Session对象。然后对该Session对象的域属性进行读写操作。

4. session失效

    Session的失效就是指Session的超时。若某个Session在指定的时间范围内一直未被访问,那么Session将超时,即将失效。
    在web.xml中可以通过标签设置Session的超时时间,单位为分钟。默认Session的超时时间为30分钟。需要再次强调的是,这个时间并不是从Session被创建开始计时的生命周期长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长。

<session-config>
	<session-timeout>120</session-timeout>
</session-config>
void invalidate()//未到超时时限,提前使session失效

5 Cookie禁用后使用Session进行会话跟踪

    若客户端浏览器禁用了Cookie,会发现向服务器所提交的每一次请求,服务器在给出的响应中都会包含名称为JSESSIONID的Cookie,只不过这个Cookie的值每一次都不同。也就是说,只要客户端浏览器所提交的请求中没有包含JSESSIONID,服务器就会认为这是一个新的会话的开始,就会为其生成一个Map.Entry对象,key为新的32位长度的随机串,value为新创建的Session会话引用。这样的话,也就无法实现会话跟踪。

6 域属性空间范围对比

ServletContext -> HttpSession -> HttpServletRequest -> PageContext

  • ServletContext,即application,置入其中的域属性是整个应用范围的,可以完成跨会话共享数据。
  • HttpSession,置入其中的域属性是会话范围的,可以完成跨请求共享数据。
  • HttpServletRequest,置入其中的域属性是请求范围的,可以完成跨Servlet共享数据,但是这些Servlet必须在同一个请求中。
  • PageContext,置入其中的域属性是页面范围的,不常用。
  • 对于ServletContext,HttpSession,HttpServletRequest这三个域属性空间对象的使用原则是,在可以保证功能需求的前提下,优先使用小范围的。这样不仅可以节省服务器内存,还可以保证数据的安全性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值