Session经常被大家翻译为【会话】,在一个应用内部设计架构中,它通常指进程内保存的状态数据或者属性。 2007年 2007年我的本科毕业设计里,用了很多JSP里嵌Java代码的操作。比如登录是这么写的: 运行效果是这样的: 对的,我就是用这么原始的技术成功的混到了毕业文凭。 我周围的男同学技术比我要好一些,他们的用法也比我要高级,前端JSP里没有调用Java代码,有专门的后端来处理。
这两种方式本质上就是使用Java Servlet配合http协议标准来实现的。 HttpSession 服务器会为每一个用户 创建一个独立的HttpSession 原理 当用户第一次访问Servlet时,服务器端会给用户创建一个独立的Session 并且生成一个SessionID,这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中 当用户再一次访问Servlet时,请求中会携带着cookie中的SessionID去访问 对于Servlet而言。服务器会根据这个SessionID去查看是否有对应的Session对象,有就拿出来使用;没有就创建一个Session(相当于用户第一次访问)。换句话说:若Servlet是客户端访问的第一个WEB应用的资源,则只有调用了request.getSession()或request.getSession(true) 才会创建HttpSession对象。 域的范围 Context域 > Session域 > Request域 Session域 只要会话不结束就会存在 但是Session有默认的存活时间(30分钟) 注意点 1>这时候的Session是跨线程的。 2>一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。基于这个注意点,多数线上服务都是采用集群或者在扩展性上支持了集群,所以现在基本上没有人使用HttpSession了,当然只是做个毕设还是可以的。 总结 通过HttpSession主要是获取其中保存的状态数据或者属性,是一种状态的保持。 2015年 2015年我做了一个PHP的项目,发现在PHP里Session那个好用。其实PHP里的Session和Java Servlet的Session原理基本相同。在集群情况下也是会失效的。但是为什么都过去8年了,Java中基本已经淘汰了这种用法,在PHP里还在用呢? 我个人理解那就是PHP语言的本身适用范围了。PHP本身适用于简单轻量的小型系统,这种系统有些就是单服务器在运行的。对可用性要求也不是特别高,出了问题可以通过立即重启或者启用备份服务器解决。Session里的信息如用户信息丢了用户重新登录就好了。 总结 通过PHP里Session和HttpSession一样,主要是获取其中保存的状态数据或者属性,是一种状态的保持。 2016年 当时做项目用到ActiveMQ,它实现了JMS标准。先看一段简单代码:
注意在上面的connection连接中创建了session。在《深入理解MQ生产端的底层通信过程-理解channel》的MQ中怎么使用Channel那一节,RabbitMQ的生产端 connection.createChannel()。对比之下,情不自禁就要问了,这里的Channel等价于Session? 自然不是啦,针对他们的区别。知乎上有个神回复:“Session是会话,比如打电话,从拨号到挂断这就是一个Session;Channel是通道,我的理解是比如打电话时,Channel表示是使用联通信号或者是移动信号或者是电信信号。” Channel是文件的读取等操作的抽象,而Session我理解是连接中状态数据的保持或者复用。Channel在《深入理解MQ生产端的底层通信过程-理解channel》里讲过了。那Session这块怎么理解呢? 在上面JMSProducer的代码中,我可写了大段的注释。这些注释可不是白写的。我们列举一下在上面的Session中显式的保存了哪些东西:
一般我们每次发消息时,消息内容会需要新建,但是生产者、消息队列、是否支持事务和客户端收到消息是否自动确认这些都可以复用。幸好人家设计的时候也设计了Session,每次直接用就可以了。 总结:MQ中的Session是连接中状态数据的保持或者复用 2020年 项目原因我研究了mybatis的源码,本来都计划为了满足项目需求自己重写一个mybatis了,后来重新规划设计没有做。在《mybatis的本质和原理》里我手撕了一个简易mybatis,里面有提到SqlSession。作用类似于一个 JDBC 中的 Connection 对象的代理,代表着一个连接资源的启用,它的作用有 3 个:
本质上我理解也是连接中状态数据的保持或者复用。一段代码感受一下:
上面在sqlSession对象中进行了事务的提交和回滚操作,非常类似于咱们在navicate等mysql客户端界面上的一个会话终端的操作。 在这同一个session下,因为就好像之前在HttpSession 登录有效期内用户的操作一样,只是界面不同。 总结 本文从个人的时间经历,分析了Session演进的血缘关系。这十几年的演进中,Session的概念越来越泛化,但是本质上还是保存的状态数据或者属性。 |
|