一:现象

有小伙伴写了下面一段代码,然后发现,随着每次关闭浏览器,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. Java string.valueof的用法以及与parseint的区别

    一.由基本数据型态转换成String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 ,也就是 String.valueOf() 这个参数多载的方法 有以下几 ...

  2. 多线程十之CopyOnWriteArrayList源码分析

    目录 简介 类结构 源码解析 构造方法 add(E e) add(int index, E element) get(int index) remove(int index) 迭代器Iterator遍 ...

  3. String、Date和Timestamp的互转

    begin 2018年8月17日19:09:49 String.Date和Timestamp的互转 String和Date的互转 关于String和Date的互转,在java8后会有不同.因为java ...

  4. 基于js的自适应、多样式轮播图插件(兼容IE8+、FF、chrome等主流浏览器)

    插件github地址:https://github.com/pomelott/slider-plug_in 使用方式: slider plug-in 左右滑动的自适应.多样式全能插件.多次调用时只需传 ...

  5. oracle 编码

    select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; PARAMETER VALUE --------- ...

  6. 修改无线wifi网络名称。注册表。windows 无线属性 windows 无线 配置文件

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha windows 无线属性 windows 无线 配置文件 ======= 修改完成,之后 ...

  7. ZOJ.3551.Bloodsucker(期望DP)

    题目链接 \(Description\) 有1个吸血鬼和n-1个人,每天有且只会有两个人/吸血鬼相遇,如果是人与吸血鬼相遇,那个人会有p的概率变成吸血鬼:否则什么也不发生.求n个都变成吸血鬼的期望天数 ...

  8. poj 1511 优先队列优化dijkstra *

    题意:两遍最短路 链接:点我 注意结果用long long #include<cstdio> #include<iostream> #include<algorithm& ...

  9. hdu 5195 线段树

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABIgAAABeCAIAAADHZri1AAATWklEQVR4nO3dvU4jTRaA4b2nvgNzBw

  10. 一键安装LNMP/LAMP

    安装步骤:1.使用putty或类似的SSH工具登陆VPS或服务器: 登陆后运行:yum install screen安装  screen screen -S lnmp创建一个名字为lnmp的会话 2. ...