对关闭浏览器后Session对象就清除的解释

在学习servlet时会发现,关闭浏览器,再打开新浏览器并发送请求,会生成了一个与关闭浏览器之前不同的新的session对象。所以初学者会有这样一种理解,就是浏览器关闭后服务端会清除session对象。但实际上是不是这样的呢?

Session是在客户端请求到达服务器时,服务器为此请求发出的客户所创建的一个对象,保存在服务器端。购物车是一个很好的例子,一个用户可以有很多session,但每个session只针对一个用户,这就保证了不同session之间的信息独立。

首先说明一点,[color=red]在通常意义上,session所能发挥作用是基于cookie机制。[/color]针对所需要解释的问题,做这样一个假设:我们第一次访问一个网页。当客户端发送请求后,服务端会建立一个针对此请求发出客户的session对象,而且每个session都会有一个sessionID。服务端会自动将这个sessionID作为一个cookie附加到response上返回给客户端,这个cookie存放在浏览器内存中。我们每次对此网页发送的request都会附带着这个cookie,服务端收到这个请求后会都去cookie中取得这个sessionID,然后查询服务端是否存在一个对应此ID的session对象。如果有,可以直接使用此session;如果没有,则会新建一个。当浏览器关闭后,其所占的内存就会是放掉,cookie自然也就被清除了,此时我们不再保存有这个sessionID。所以再打开浏览器访问同一个页面时,由于没有sessionID,也就查不到对应的session对象,此时重新创建一个新的session对象。

那当我们关闭浏览器之后,服务器端原来的session对象是否还存在呢?答案是肯定的。服务端根本不知道我们是否关闭了浏览器,也不关心这个。客户端与服务端之间进行通信的唯一途径就是通过请求。服务器有自己的一套机制来管理session,比如多长时间会清除没有使用过的session对象,等等。

所以说,关闭浏览器session就被清除只是我们所看到的表面现象(实际上是新建了一个session对象),通常情况下,服务器并不会马上清除session对象,但这个根据服务端的设定而不同。

PS:cookie一般分为两种:一种是会话cookie,即服务端为session自动创建的cookie,这个cookie存放在浏览器进程中。另一种是可以存放在硬盘上的,可以通过服务端的某些设置,将一些信息放到cookie中并返回给客户端存放在硬盘上。

[list] 在以下情况中,session会结束生命周期,Servlet容器会将session所占用的资源释放掉:
[*]客户端关闭浏览器(虽然不是这样,但还是这么说吧,解释参见上面)
[*]Session过期
[*]服务器端调用了HttpSession的invalidate()方法
[/list]
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值