Session会话追踪的实现机制

Session(会话)是Servlet中的一种特殊的机制,它可以用来存储K-V键值对,它的生命周期较长,在服务器关闭或Session失效和客户端浏览器关闭之前,Session中的数据都不会消失,而且每个客户端独有一个Session会话,相互之间互不干扰。但是我们使用的Http协议是一种无状态协议,Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。

每个用户第一次访问服务器后,服务器都会自动创建一个Session并且生成一个唯一的Session ID随着第一次响应带给客户端浏览器,这样,用户以后每次在访问服务器时都会带着上次获取的SessionID,这就像是一个“身份证”一样,以便于服务器更好的识别用户身份。如果用户在一段时间内没有访问服务器,那么Session会自动失效,下次即使带着上次分配的Session ID访问,服务器也会认为这是一个新用户,会再次分配新的Session ID。一次Session会话中往往包含着若干次request请求。

当我们需要向Session(会话)中存储值时,这时我们只需获取服务器已经创建好了的Session,JavaEEServlet机制内建立了对Session的支持。当我们需要获取Session时,可以通过request请求对象的getSession()方法即可,

HttpSession session = request.getSession();

服务器识别Session的关键就是依靠一个名为JSESSIONIDCookie。在Servlet中第一次调用req.getSession()时,Servlet容器自动创建一个Session ID,然后通过一个名为JSESSIONIDCookie在响应头中发送给浏览器。 如下图所示:

使用Session时,由于服务器把所有用户的Session都存储在内存中,如果遇到内存不足的情况,就需要把部分不活动的Session序列化到磁盘上,这会大大降低服务器的运行效率,因此,放入Session的数据不能太大,否则会影响服务器的运行。

实际上,Servlet提供的HttpSession本质上就是通过一个名为JSESSIONIDCookie来跟踪用户会话的。除了这个名称外,其他名称的Cookie我们可以任意使用。

创建一个新Cookie时,除了指定名称和值以外,通常需要设置setPath("/"),浏览器根据此前缀决定是否发送Cookie。如果一个Cookie调用了setPath("/user/"),那么浏览器只有在请求以/user/开头的路径时才会附加此Cookie。通过setMaxAge()设置Cookie的有效期,单位为秒,最后通过resp.addCookie()把它添加到响应。

通过创建Cookie,我们可以实现在客户端浏览器中存储数据的目的,例如保存用户名和密码。在Chrome浏览器中,单个 Cookie的长度不能超过 4069 个字符(包括 name,但不包括 = 号)。

通过读写Cookie可以在客户端存储数据,如果我们要读取某个Cookie,只能依靠遍历HttpServletRequest附带的所有Cookie

 

 

 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值