zoukankan      html  css  js  c++  java
  • 浏览器关闭后Session真的消失了吗?

    今天想和大家分享一个关于Session的话题: 当浏览器关闭时,Session就被销毁了? 
    我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保
    存当前用户的状态信息,初学它的时候,认为Session的生命周期是从打开一个浏览器窗
    口发送请求到关闭浏览器窗口,但其实这种说法是不正确的!下面就具体的去解释:
              当用户第一次访问服务器web应用程序中支持session的某个程序的时候,客户端(浏览器)的请求头cookie属性中没有JSESSIONID信息,那么服务器接收到请求后执行了getSession()方法,首先会判断是否有JSESSIONID,如果不存在的话,就只姐创建一个新的Session,存在的话就会通过jSESSIONID取出对应的Session。
    再详细些:
    当一个Session开始时,Servlet容器会创建一个HttpSession对象,那么在HttpSession对象中,可以存放用户状态的信息
    Servlet容器为HttpSession对象分配一个唯一标识符即Sessionid,Servlet容器把Sessionid作为一种Cookie保存在客户端的 *浏览器* 中
    用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出Sessionid,然后根据这个Sessionid找到相应的HttpSession对象,从而获取用户的状态信息
     
    以上就是Session的运行机制,但是还没有提到Session的生命周期,再往下了解!
    其实让Session结束生命周期,有以下两种办法:
     一个是Session.invalidate()方法,不过这个方法在实际的开发中,并不推荐,可能在强制注销用户的时候会使用;
    一个是当前用户和服务器的交互时间超过默认时间后Session会失效
    session.setMaxInactiveInterval(int seconds);//秒为单位
    我们知道Session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送
    任何请求来关闭Session,自然Session也不会被销毁,但是可以做一点努力,在所有的
    客户端页面里使用JavaScript中的window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法就是不去管它,让它等到默认的时间后,自动销毁
     
    那么为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?
    其实之前的Session一直都在服务器端,而当我们关闭浏览器时,此时的Cookie是存在
    于浏览器的进程中的(存放在内存中),当浏览器关闭时自然Cookie也就不存在了。
     
    其实Cookie有两种:
    一种是存在于浏览器的进程中(内存中)
    一种是存在于硬盘上
    而session的Cookie是存在于浏览器的进程中,那么这种Cookie我们称为会话Cookie,
    当我们重新打开浏览器窗口时,之前的Cookie中存放的Sessionid已经不存在了,此时服务器从HttpServletRequest对象中的请求头里面没有检查到sessionid,服务器会再响应给客户端一个新的存有Sessionid的Cookie标识(JSESSIONID)到客户端的浏览器中,此时对应的是一个新的会话,而服务器上原先的session等到它的默认时间到之后,便会自动销毁
     
    PS:
    按照以上定理,我们可以设想一下,如果我们获取了某一个用户的JSESSIONID,那么我们是不是可以通过某些方式来把这个Session ID 写入到我们的浏览器中,来伪造对方呢?
  • 相关阅读:
    学习进度笔记06
    学习进度笔记05
    学习进度笔记04
    学习进度笔记03
    学习进度笔记02
    周总结13
    周总结12
    周总结11
    人月神话阅读笔记3
    第一阶段冲刺10
  • 原文地址:https://www.cnblogs.com/arebirth/p/javaservletsession.html
Copyright © 2011-2022 走看看