Session与Cookie详解

本文深入解析了Session的创建和消亡过程,阐述了Session并非在网页访问时立即创建,而是在调用request.getSession()方法时产生。同时,文章详细说明了Session的默认生命周期为30分钟,以及在浏览器关闭后Session的状态变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Session的创建和消亡

      1.Session的创建:

      Session并不是一访问网页就会立即被创建是在调用request.getSession()方法时才会被创建。

      什么时候会调用request.getSession()方法分为两种情况:

            ①如果servlet中没有调用request.getSession()方法,那么服务器永远都不会创建session

            ②如果用户第一次访问servlet页面,  会调用request.getSession()方法创建一个session,

               当用户第二次访问该servlet时, 会先去服务器中寻找对应的session,如果有就不创建,没有才会创建。

       注意:jsp默认调用getSession()方法。
                 默认的情况下,用户第一次访问jsp页面就会创建session,因为jsp中指令session默认配置为true,

                 即<%@ pagesession="true"%>,在index.jsp的java代码中,自动获取了session。

 jsp的本质是servlet,只有在servlet中调用request.getSession(),服务器才会产生session。如果调用 request.getSession(false);将不会产生session。                            

      2.session的消亡:

      默认情况下超过30分钟会消亡。这里的30分钟,不是指session的生命周期,而是客户端不与服务器进行交互后到session自动销毁的时间间隔。如果客户端一直与服务器进行交互,或者客户端会定时向后台发送请求以确保session不过期(新浪微博就是这样的机制),那么只有在浏览器关闭之后等待超时才会销毁session。

浏览器关闭后session会不会消亡?

      Session是一种服务器端的对象,保存在服务器中。每个Session 有一个唯一的Sessionid。 Session的超时也是由服务器来控制。我们一般都会把Session和Cookie放在一起来说,Cookie分为内存中Cookie(也可以说是进程中Cookie)和硬盘中Cookie。大部分的Session机制都使用进程中Cookie来保存Sessionid的,关闭浏览器后这个进程也就自动消失了,进程中的Cookie自然就消失了,那么Sessionid也跟着消失了,原有的session仍然存活在服务器中。当我们重新打开浏览器窗口时,就无法根据Sessionid找到原来的Session了,此时服务器从HttpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上原先的session等到了它的默认时间之后,便会自动销毁。

      其实服务器是不会知道浏览器关闭了没有(当然,你可以在关闭的时候去通知服务器,但一般都不会这样做),所以关闭浏览器时服务器是不会删除Session的,也正是这个原因服务器才会设置一个Session失效时间的,不然服务器早晚会被撑爆的。等距离上一次使用该Session的时间达到设置的失效时间时,服务器就会认为客户端已停止活动,便会将相应的Session删除。

如何在浏览器关闭后找到原来的session?

      //1.创建一个cookie,保存原session的id

      Cookie cookie = new Cookie("JSESSIONID", session.getId());//此处的session是原来的session

      //2.设置cookie的生命时长为24小时,此时浏览器就会把cookie保存到硬盘上,这个cookie就变成了硬盘中Cookie,

      浏览器关闭后硬盘中Cookie并不会消失,重新打开浏览器后,这个cookie仍然有效直到超过设定的生命时长。

      cookie.setMaxAge(60*60*24);

      //3.设置cookie的使用路径,下面这种设置表明在整个web范围内都可以使用这个cookie

      cookie.setPath(request.getContextPath()+"/");

      //4.将cookie添加到响应头中

      response.addCookie(cookie);

      上述设置完成之后,重新打开浏览器,保存原来sessionid的cookie仍然存活,此时就可以通过原来的sessionid找到原来的session。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值