Session的生命周期(同一浏览器,无论关闭与否,使用同一个session会话,直到session销毁)...

Session的生命周期

1.1 session什么时候创建:

  Session一般存储在服务器的内存中,Sessinon在用户访问第一次访问服务器时创建(注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session)。当然,强制生成Session可使用request.getSession(true)方法

1.2 session什么时候销毁:

  1.session的持有者(即客户端浏览器)在最大无活动等待时间(MaxInactiveInterval)内无任何响应或请求 ;

     设置方法有许多(这里随便写两种):
           1.session.setMaxInactiveInterval(2 * 3600); // Session保存两小时
           2.web.xml里有:
            <session-config>
                <session-timeout>10</session-timeout>
            </session-config>

  2.调用Session的invalidate方法强制销毁。

  3.jsp服务器重起或发生中断(这个和tomcat服务器的配置有关(默认不销毁,可以设置全部销毁),重启默认前会把session写入文件里保存,重启后会读取session文件,所以session默认时间没过还是存在的)   
  注意:关闭浏览器并不会销毁session,默认下次开启浏览器会新建session,但是旧的session会在最大无活动等待时间后自动执行销毁。(文章后面教如何实现一直使用同一个session)

1.3 Session怎么识别用户(服务器怎么识别/区分用户):

  Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

      具体:当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为了标识唯一的客户端用户,内容不会重复,这就是sessionid.该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

  怎么实现关闭浏览器,再打开浏览器时候使用原来的session:

  或者关闭浏览器,再打开浏览器还是登陆的状态:

  或者重新打开浏览器没有新建session:

  或者使用Cookie实现短时间内不用重新登陆(当然后台也没有自动登陆,和自动登陆有区别):

  方法:因为保存Sessionid的cookie是临时的(浏览器关闭就会销毁),所以我们自己手动创建一个持久化的cookie,用来保存sessionid;

    //一下是持久化cookie,保存sessionid,实现关闭浏览器,重新打开还是使用原来的session
    session.setMaxInactiveInterval(2 * 3600);  // Session保存两小时
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(2 * 3600);  // 客户端的JSESSIONID也保存两小时
    cookie.setPath("/");        
    response.addCookie(cookie);

   (注意,第一次访问时候遍历cookie只有一个cookie,刷新第二次访问遍历却有两个cookie,我想:第一次访问自动生成的临时cookie还没有返回给浏览器,第一次访问结束了,浏览器才有了

临时的cookie,和我们手动持久化的cookie,所以第二次访问遍历获取了两个cookie,都有相同的sessionid属性。关闭浏览器,再访问,遍历只有一个cookie,因为临时的cookie关闭浏览器时候销毁了,

现在只使用持久化的cookie了,里面有sessionid属性)

1.4 如果Cookie功能警用,我们怎么识别用户?

      Java Web提供了另一种解决方案:URL地址重写。

  URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

  注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

转载于:https://www.cnblogs.com/huangchanghuan/p/5800898.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值