一:现象

有小伙伴写了下面一段代码,然后发现,随着每次关闭浏览器,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. winform解析json

    在使用C#开发爬虫程序时,会遇到需要解析json字符串的情况.对于json字符串可以使用正则表达式的形式进行解析,更为方便的方法是使用Newtonsoft.Json来实现. Nuget添加应用包 在工 ...

  2. 自定义yum源

    1.创建rpm包的存放目录 mkdir  -p   /yum/yum-sum/package 2.准备rpm包,可以通过自带yum只下载不安装工具下载 yum install --downloadon ...

  3. Ubuntu 18.04 上设置桌面程序开机自启动

    需求 在新安装的 Ubuntu 18.04 系统上,将有些不可描述的程序开机之后自动启动 Startup Applications Preferences 打开 Startup Application ...

  4. 通过jstack与jmap分析一次线上故障

    一.发现问题 下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复. 二.排查思路 简单分析下可能出问题 ...

  5. 贝壳找房魔法师顾问[并查集+DAG判断]

    题目链接[https://nanti.jisuanke.com/t/27647] //计蒜客2018复赛D题,想简单了. 题解: 题目是中文的,不再赘述. 题解: 分为三种情况:1.两个字符串都不能变 ...

  6. jni的一些基础知识和概念

    11.1基础知识 JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |-  ...

  7. WEB应用从服务器主动推送Data到客户端有那些方式?

    1)  html5 websocket 2)  WebSocket 通过 Flash 3)  XHR长时间连接 4)  XHR Multipart Streaming 5)  不可见的Iframe 6 ...

  8. HDU 5842 Lweb and String 水题

    Lweb and String 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5842 Description Lweb has a string S ...

  9. MIPS Mars 安装

    Mars 4.5下载 Java 环境配置好了以后可以直接双击打开 Mars

  10. CentOS启动OpenVPN报错:Failed to start OpenVPN Robust And Highly Flexible Tunneling Application On server.

    tailf /var/log/openvpn.log 查看日志,里面有最详细的错误解说. 参考: https://forums.openvpn.net/viewtopic.php?t=21561