一:现象

有小伙伴写了下面一段代码,然后发现,随着每次关闭浏览器,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. C语言:指针实现输出梯形字符串

    用指针实现,实现过程无需将子串复制到一个新的字符串中.(10分) 题目内容: 用指针实现,实现过程无需将子串复制到一个新的字符串中. 输入格式: 字符串 输出格式: 子串 输入样例: computer ...

  2. spark sql中进行sechema合并

    spark sql中支持sechema合并的操作. 直接上官方的代码吧. val sqlContext = new org.apache.spark.sql.SQLContext(sc) // sql ...

  3. Noip2018游记——AFO

    本来Day 0和Day 1写得挺轻松的,结果没想到Day 2是这样的画风...心情逐渐沉重... Day 0 白天的时候颓的一批,上午考的信心赛还打错了一个字母然后$100pts\rightarrow ...

  4. 图片视频访问servlet(支持苹果视频断点续传)

    package com.sm.common.servlet; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  5. 条件随机场(crf)及tensorflow代码实例

    对于条件随机场的学习,我觉得应该结合HMM模型一起进行对比学习.首先浏览HMM模型:https://www.cnblogs.com/pinking/p/8531405.html 一.定义 条件随机场( ...

  6. [Java]struts2-spring整合时配置监听器

    1.struts2-spring整合时配置监听器 [在web.xml中] <!-- 上下文载入器监听器,确保web服务器启动时,直接完成spring容器的初始化 --/> [Ctrl + ...

  7. jersey练习

    package com.tz.router; import java.util.ArrayList; import java.util.Date; import java.util.List; imp ...

  8. 使用 IntraWeb (20) - 基本控件之 TIWGrid

    TIWGrid 最终通过 Html Table 呈现; 其每个 Cell 都是一个 TIWGridCell 对象, Cell 对象的 Control 属性非常好, 可以非常方便地嵌入其他控件. TIW ...

  9. .net core下的dotnet全局工具

    .net core 2.1后支持了一个全新的部署和扩展命令,可以自己注册全局命令行. dotnet install tool -g dotnetsaydotnetsay 也可以自己构建自己的命令行,一 ...

  10. STM32F4 Timer External Clock TI2 Both Edges Demo

    #define CLK_FREQ ( 10000 ) #define CORE_FREQ ( 168000000 ) static void TIM_GPIO_Config( void ) { GPI ...