Session会话是如何结束的

当浏览器关闭时,Session就被销毁了?
       我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保存当前用户的状态信息,初学它的时候,认为Session的生命周期是从打开一个浏览器窗口发送请求到关闭浏览器窗口,但其实这种说法是不正确的!

下面就具体的去解释:
       当用户第一次访问Web应用中支持Session的某个网页时,就会开始一个新的Session,那么接下来当用户浏览这个Web应用的不同网页时,始终处于一个Session中

再详细些:
       当一个Session开始时,Servlet容器会创建一个HttpSession对象,那么在HttpSession对象中,可以存放用户状态的信息
       Servlet容器为HttpSession对象分配一个唯一标识符即Sessionid,Servlet容器把Sessionid作为一种Cookie存在客户端的 浏览器
       用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出Sessionid,然后根据这个Sessionid找到相应的HttpSession对象,从而获取用户的状态信息

以上就是Session的运行机制,但是还没有提到Session的生命周期,再往下了解!

其实让Session结束生命周期,有以下两种办法:
       1.一个是Session.invalidate()方法,不过这个方法在实际的开发中,并不推荐,可能在强制注销用户的时候会使用;
       2.一个是当前用户和服务器的交互时间超过默认时间后,Session会失效

       我们知道Session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送任何请求来关闭Session,自然Session也不会被销毁,但是可以做一点努力,在所有的客户端页面里使用js的window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法就是不去管它,让它等到默认的时间后,自动销毁

那么为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?
       其实之前的Session一直都在服务器端,而当我们关闭浏览器时,此时的Cookie是存在于浏览器的进程中的,当浏览器关闭时,Cookie也就不存在了。

其实Cookie有两种:
       一种是存在于浏览器的进程中;
       一种是存在于硬盘上

       而session的Cookie是存在于浏览器的进程中,那么这种Cookie我们称为会话Cookie
当我们重新打开浏览器窗口时,之前的Cookie中存放的Sessionid已经不存在了,此时服务器从HttpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上原先的session等到它的默认时间到之后,便会自动销毁。

ps:
当在同一个浏览器中同时打开多个标签,发送同一个请求或不同的请求,仍是同一个session;
当不在同一个窗口中打开相同的浏览器时,发送请求,仍是同一个session;
当使用不同的浏览器时,发送请求,即使发送相同的请求,是不同的session;
当把当前某个浏览器的窗口全关闭,再打开,发起相同的请求时,就是本文所阐述的,是不同的session,但是它和session的生命周期是没有关系的.

————————————————
版权声明:本文为CSDN博主「Stangor」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/stanxl/article/details/47105051

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转自 :http://blog.csdn.net/taoff/articles/1921009.aspx 一、术语...
    stone_yao阅读 11,371评论 0 31
  • java的会话管理:Cookie和Session 1.Cookie机制 Cookie技术是客户端的解决方案,Coo...
    为爱放弃一切阅读 3,130评论 0 0
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 4,594评论 0 0
  • Servlet:Sun公司制订的一种用来扩展Web服务器功能的组件规范。当浏览器将请求发送给Web服务器(比如:a...
    南山伐木阅读 3,638评论 0 4
  • 学了很多,要学以致用,要实践才能真正的掌握。 记得很久以前就看过scqa,看过就看过了,也就是个概念而已,今天再看...
    书宸阅读 1,443评论 0 0