Session深度解析

第 1 章 简介

1. 广义的session

       中文名称会话,Http客户端和Http服务器开始通信,就会产生会话,会话过程是可以连续的,也可以是时断时续的,它会有一个时间范围,表象就是你登录一个网站,如果长时间未登录,网站会提示你,这就是对session的一种应用。

2. JavaEE中的session

       JavaEE规范中,session被定义为一个具体的接口,javax.servlet.http.HttpSession,这个接口最终由符合JavaEE规范的应用服务器来实现,如我们最常用的Tomcat、Weblogic、Websphere等,session通常是存储在服务器内存中的(也有其它存储方式,但这里只讨论这种情况),也就是说session是服务器创建的,而不是浏览器创建的(刚开始学习时,老师经常这么说,可能也是为了方便理解)。

第 2 章 生命周期

       从无到有,从有到无。

1. session的创建

1.1. session是服务器创建的对象,放在服务器内存中,那它是什么时候创建的?

       以Tomcat为例,当使用浏览器访问一个jsp时,Tomcat会先根据jsp生成java文件,再编译成class,最后运行,输出内容到浏览器,浏览器解析呈现给用户。java和class文件会放到<Tomcat安装目录>/work/Catalina/localhost/<你的应用>/org/apache/jsp/<相应包>下,比如你有个test.jsp,那么就会生成test_jsp.java文件。打开test_jsp.java,找到其_jspService方法,会看到声明了一些我们常说的jsp内置对象。

PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
JspWriter out = null;

       再往下看,会看到有一句session = pageContext.getSession();,这里生成了session对象,也就是说,访问jsp时,服务器自动生成了session对象(可以在jsp的page声明中加入session="false",禁用session)。

1.2. 服务器生成session后,浏览器下次访问,服务器怎么判断session?

       启动一个应用,访问一个jsp,这里以我本地的为例。

       初次访问服务器上的一个jsp,服务器在响应头中设置了临时cookie,并加上了一JSESSIONID(毋庸置疑,肯定是服务器给加上的,Tomcat具体代码我没有去找)。

       第二次访问jsp:

       浏览器将存储JSESSIONID的cookie随着请求一起发送到服务器,服务器通过JSESSIONID到内存中找到上次生成的session对象,从而实现客户端(浏览器)共享session。JSESSIONID也可以拼在url上,如http:///localhost:8080/testApp/test.jsp;JSESSIONID=XXXXXXXXXXXX?param1=value1,JSESSIONID可以通过request.getSession().getId()得到,url中如果有JSESSIONID,服务器就不会从cookie中取了。

       注:浏览器多个tab之间(同一域下)共享session,实际上就是临时cookie都一样,JSESSIONID都是一个。而多个窗口之间使用不同的cookie不一样,所以不能共享session。

2. session的销毁

2.1. session在服务器创建后,什么时候会消失呢?

  • 服务器被强制关闭,肯定啥都没有了,这要看服务器具体的实现,像Tomcat正常关闭(使用shutdown,而不是X掉)的话,是会对session序列化到硬盘上的,重新启动后,会读取,原有的session依然存在。
  • 程序中调用session.invalidate(),销毁当前session方法。
  • session超时,超时指的是服务器连续一段时间内(超出了应用中设置的最低时限)没有接收到session所在客户端的请求,服务器从内存中移除该session对象。

2.2. 浏览器窗口关闭,session会消失吗?

       老师通常这么告诉,很多书中也这样讲,真是偷换概念,大错特错,浏览器关闭后,只是对应服务器session的JSESSIONID消失了,而服务器再也用不到这个session,导致超时,服务器会自动销毁。

       注:本文中讨论的session只是存储在服务器内存的情况,诸如其它放在Cache中、分布式存储、持久化神马的,还没接触,也就没研究。

第 3 章 总结

  • session是消耗服务器内存的,所以要合理使用session,别什么东西都往session里放。
  • session是由服务器创建的,跟浏览器没有半毛钱关系,浏览器只是拿到一个JSESSIONID。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

浅谈php安全

这段时间一直在写一个整站,前几天才基本完成了,所以抽个时间写了一篇对于php安全的总结。 技术含量不高,过不了也没关系,希望能一些准备写网站的朋友一点引导。 在...

1797
来自专栏沃趣科技

ASM 翻译系列第三十四弹:ASM磁盘组重要属性介绍

原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy....

3236
来自专栏农夫安全

浅说驱动程序的加载过程

在开始之前,首先简要介绍一下本文的主题,这篇文章是关于将内核模块加载到操作系统内核的方法的介绍。所谓“内核模块”,指的便是通常所说的驱动程序。不过因为加载到内核...

2729
来自专栏Kubernetes

Kubernetes GC in V1.3 源码分析

本文是对Kubernetes V1.3发布的新Garbage Collector模块的源码解读。实际上本文的是基于kubernetes v1.4的代码进行分析的...

34211
来自专栏java达人

武林外传—阿沅,这是依赖传递呀!

武三通最近收养了一个义女,叫阿沅,此女自幼父母双亡,十分孤苦,武三通对他一直疼爱有加,不光教她武术,还教她编程,想着日后等阿沅长大了,也可以当个程序媛什么的,作...

513
来自专栏Python中文社区

djongo:Django和MongoDB连接器

作者:小江,python爱好者,自学中,尝试爬虫、Django开发以及大数据,非CS科班出身。在校主要用MATLAB,现工作中偶尔使用python。博客主页:h...

932
来自专栏吕亚辉的专栏

【腾讯云的1001种玩法】CRUD生成器DBuilder介绍与腾讯云部署

Dbuilder是基于laravel4开发的一套快速实现数据库表CRUD(增删改查)操作的工具,核心思想是做到针对数据库表的每个字段做到精确配置,通过生成字段配...

2740
来自专栏地方网络工作室的专栏

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十四)在项目中使用 jQuery

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十四)在项目中使用 jQuery 前情回顾 在上一篇博文中,我们讲到了,...

1877
来自专栏Hadoop实操

如何使用CDSW在CDH中分布式运行所有R代码

无需额外花费过多的学习成本,sparklyr(https://spark.rstudio.com)可以让R用户很方便的利用Apache Spark的分布式计算能...

4466
来自专栏恰同学骚年

在.NET中使用反射实现简易插件机制

  本篇是我学习反射的一个应用小场景而做的学习笔记,主要是一个小的总结,并对各个步骤的记录,以便将来回顾。

391

扫码关注云+社区