那些年被误导的 Session

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Headmaster_Tan/article/details/75531089

       一开始我是拒绝的,说什么 session 在浏览器关闭之后还在?开玩笑那我岂不是一直都被教错而且还理解错了?

       好吧,事实就是这样,浏览器关闭销毁的是 sessionId,在服务端的 session(只要没超过设置的时间)依然存在,今天就来换个姿势重新认识这个 Session:


为什么关闭浏览器 session 还在?


       浏览器第一次访问服务器时,服务器端会创建一个 session ,然后会将一个 sessionId 返回给浏览器,浏览器会保存这个 sessionId。浏览器在下一次请求时会偷偷地携带上这个 sessionId,然后服务器会把这个 sessionId 和自己内存中存放的 sessionId 进行对比,从而识别区分不同的客户端。当浏览器关闭时,将会清除这个 sessionId,再次打开浏览器访问时由于请求不再携带 sessionId,所以服务器端会再次创建一个 session,并把新的 sessionId 返回给浏览器。。。。(循环)


       说到这里答案已经很明白了,因为服务器没办法知道你是否关闭了浏览器,但是关闭浏览器会清除浏览器存放的 sessionId,从而导致再次打开浏览器访问时需要重新创建 session,所以会给你造成一个假象:"关闭浏览器 session 就被删除了!",但事实是客户端没有 sessionId 和服务器端的 sessionId 匹配了,再者 session 只能同时存在一个,那自然就只能重新再创建一个 session 咯。


什么时候才会删除 session?


       1、session 超时:指的是连续一定时间服务器没有接收到该 session 所对应的客户端的请求,并且这个时间超过了服务器设置的 session 的最大时间

       2、程序调用 HttpSession.invalidate()

       3、服务器关闭或服务停止

       所以别再说什么关闭浏览器 session 就去见上帝了。。。


为什么关闭浏览器会清除 sessionId ?


       首先要明白一件事,sessionId 是以什么形式存放在浏览器的?答案是:cookies

       既然是以 cookies 的形式存放,那就是说可以对它的存活期进行设定,那到底是谁给它的存活期设置成了关闭浏览器就销毁??这里以 Tomcat 创建 会话cookie(我们通常都将关闭浏览器时删除的 cookies 称为 "会话cookie",分不清"会话cookie"和"持久cookie"戳这里http://hhlux.iteye.com/blog/334729) 为例:

org.apache.catalina.connector.Request.java:

protected void configureSessionCookie(Cookie cookie) {  
    cookie.setMaxAge(-1);  
    String contextPath = null;  
    if (!connector.getEmptySessionPath() && (getContext() != null)) {  
        contextPath = getContext().getEncodedPath();  
    }  
    if ((contextPath != null) && (contextPath.length() > 0)) {  
        cookie.setPath(contextPath);  
    } else {  
        cookie.setPath("/");  
    }  
    if (isSecure()) {  
        cookie.setSecure(true);  
    }  
}

       答案就是这行代码:cookie.setMaxAge(-1);  它表示 cookies 在浏览器关闭时被删除。


如何关闭浏览器再打开还能保持登录状态?


       上面已经提到了,sessionId 在客户端是以 cookies 的形式保存的,cookies 在不设置存活期的情况下是关闭浏览器就会删除,所以说你完全可以给它设置一个时间,确保它可以保存在本地一段时间,从而实现关闭浏览器后再打开,请求服务器端时还能记住你的登录状态。

       当然这是建立在你的 session 没过期的前提下的喔。而且肯定也不止这一种方法,别的方法和原理戳这里:http://canann.iteye.com/blog/1687425


       事实证明,学东西还是要多动手啊!!!(多么痛的领悟)

猜你喜欢

转载自blog.csdn.net/Headmaster_Tan/article/details/75531089