一:现象

有小伙伴写了下面一段代码,然后发现,随着每次关闭浏览器,count的值重新开始计数了,如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

HttpSession session = request.getSession();

if (session.getAttribute("b") == null) {
        session.setAttribute("b", 1);
    } else {
        int count = (Integer) session.getAttribute("b");
        session.setAttribute("b", count + 1);
    }
    System.out.println((Integer) session.getAttribute("b"));
}

同学心中有疑虑,不是说session有默认失效时间30分钟吗,怎么我的session随着浏览器关闭瞬间失效了?

二:原因

我们是在浏览器中通过url去访问web服务器的。当我们访问浏览器的时候,就得告诉web服务器,你就是你。比如,张三在北京打开浏览器,访问zuikc.com/hello,李四在上海打开浏览器,同样访问zuikc.com/hello。那服务器得知道这两个请求,一个是张三的,一个是李四的。

服务器怎么判断?这需要浏览器配合。

浏览器访问服务器的时候,会带上一个sessionid,比如上文代码中,我们在chrome中可以看到这个sessionid,

张三和李四的sessionid是不同,对于服务器来说,就知道是两个不同的人访问了我,这样它才能在自己的内存中维护一个session的字典,这个字典集合的key就是这个sessionid,这样才能保持两个人之间的session的值是相互独立的。比如,张三的b值+1了,而李四的b值是不会加1的。

but,注意到上图红圈中的session(此session非彼session,不是上文中所指的服务器端session,如果是我,一定会给它改个名,叫做“temp临时”)了吗?

【重点】

1:sessionid一般是存储在浏览器cookie中的;

2:而cookie分为临时(session)cookie和永久cookie。上图中带session字样的就是临时cookie,带有日期的就是永久cookie;

3:临时cookie存储在浏览器内存中,随着浏览器关闭而没有了;

4:永久cookie存储在硬盘上,在日期前都会存在;

所以,很不幸,我们的sessionid是个临时cookie,我们关闭浏览器,它就没有了,不信?大家可以尝试关闭再打开浏览器,看看sessionid的值是不是变化了。

三:解决办法

道理很简单,原因也找到了,要解决这个问题就稍微有点复杂了。我们得拦截sessionid写到cookie的这个过程,将它变为一个永久cookie,或者,咱就不要将sessionid存在cookie了,存储在数据库、分布式缓存或者别的什么地方。现在,我们来写一个大致思路:

1:封装自定义的HttpServletRequest;

2:封装自定义的 HttpSession

3:定义一个filter,拦截HttpServletRequest对象,在dofilter的时候,将sessionid得到,在写cookie的时候将sessionid变为一个永久cookie;

四:关于session还有很多好玩的东西

比如,重新在服务器端生成自己的session值,如下:

    HttpSession oldSession = request.getSession();

    Enumeration attrNames = oldSession.getAttributeNames();
Properties props = new Properties(); if (attrNames != null) {
while (attrNames.hasMoreElements()) {
String key = (String) attrNames.nextElement();
props.put(key, oldSession.getAttribute(key));
} //Invalidating previous session
oldSession.invalidate();
//Generate new session
HttpSession newSession = request.getSession(true);
attrNames = props.keys(); while (attrNames.hasMoreElements()) {
String key = (String) attrNames.nextElement();
newSession.setAttribute(key, props.get(key));
}
}

为什么你的session不见了的更多相关文章

  1. JAVA EE中session的理解

    转自[互动百科]http://www.baike.com/wiki/Session   Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...

  2. java session 详解

    原网址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于tra ...

  3. Java基础-关于session的详细解释

    转自:http://hi.baidu.com/zbzbzb/item/65d73d2a4d07cfd40f37f900 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于 ...

  4. Java——Cookie与Session

    Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使用方法 Cookie实际上是一小段文本信息.客户端请求服务器,如果服务 ...

  5. Session机制详解

    转自:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能 ...

  6. 理解HTTP session原理及应用

    转自:http://www.2cto.com/kf/201206/135471.html 一.术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣 ...

  7. 跨应用Session共享

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...

  8. Session的实现与存储

    [集群中session安全和同步]   使用数据库来保存session,就算服务器宕机了也没事,session照样在. 每次请求都进行数据库读写开销不小(使用内存数据库可以提高性能,宕机就会丢失数据. ...

  9. WEB应用中的SESSION知多少?

    作为一名WEB开发程序员,对session的理解是最基础的,但是现状是WEB程序员遍地都是,随便一划拉一大把,不过估计能把session能透彻理解的人应该不是很多,起码我之前对此是知之甚少,偶然看到的 ...

随机推荐

  1. day12--python操作mysql

        本篇对于Python操作MySQL主要使用两种方式:     1.原生模块 pymsql(http://www.cnblogs.com/wupeiqi/articles/5713330.htm ...

  2. WebApi 文档Swagger

    NET WebApi 文档Swagger中度优化   本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws   写在前面 在后台接口开发中,接口文 ...

  3. 基于FPGA dspbuilder的DNLMS滤波器实现

          自适应滤波器一直是信号处理领域的研究热点之一,经过多年的发展,已经被广泛应用于数字通信.回声消除.图像处理等领域.自适应滤波算法的研究始于20世纪50年代末,Widrow和Hoff等人最早 ...

  4. Eclipse中从svn中检出maven项目

    相信很多初学者都遇到过Eclipse中从SVN检出Maven项目之后看到的目录结构并不是Maven目录结构:或者只能先用SVN将Maven项目签入到本地,然后再用Eclipse导入Maven项目,但是 ...

  5. List,Set的区别

    1.List,Set都是继承自Collection接口2.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该 ...

  6. Scrapy 模拟登陆知乎--抓取热点话题

    工具准备 在开始之前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 若是你有使用 postman 那就更好了.           Python   1 scrapy genspid ...

  7. leetcode 岛屿的个数 python

      岛屿的个数     给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包 ...

  8. 【tarjan+SPFA】BZOJ1179-[Apio2009]Atm

    [题目大意] 给出一张有点权的有向图,已知起点和可以作为终点的一些点,问由起点出发,每条边和每个点可以经过任意多次,经过点的权值总和最大为多少. [思路] 由于可以走任意多次,显然强连通分量可以缩点. ...

  9. Eclipse中执行Maven命令时控制台输出乱码

    Maven 默认编码为 GBK: 在 Eclipse 控制台输出乱码: 解决方法:将以下代码添加到 pom.xml 的 <project> 节点下: <project> …… ...

  10. ant design Modal关闭时清除数据的解决方案

    背景:modal组件关闭时不清除数据,原来输入的数据还存在 解决方案: 1.modal的api:destroyOnClose 2.手动控制modal的销毁 this.state = { destroy ...