首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Session理解

在WEB开发中,由于Http协议无状态,使得服务器无法判断目前这一个客户端连接是否为前一个客户端访问。因此出现了会话跟踪技术。

对于会话跟踪技术,解决的方案有三种,我们可以借助最形象的例子进行描述,例如奶茶店搞活动,如果消费者消费满10杯奶茶,那么商家将赠送一杯奶茶。那么我们在现实生活中有什么样的解决方式了?

商家特别厉害,如果客户前来消费,那么能够记住客户已消费的记录。此种场景不常见,除非客户太有特征。如果采用该模式,这与我们HTTP协议无状态将相违背。

消费卡方案。客户每次消费之后,在消费卡上盖章,相信此种方式大家或多或少都接触过,比较土,但是也比较实用的方法。这种方案是将消费信息记录在客户的消费卡上,在JAVAEE体系中,我们称为Cookie技术,用来将数据保存在客户端的技术。

会员卡方案。在现代网络技术这么发达的时代,此种场景应该是最贴近大家生活的解决方案。客户持有会员卡,商家有服务器。客户提供卡号,商家可以利用该卡号查找出该客户消费的记录。在JAVAEE体系中,我们称之为Session技术,用来将数据保存在服务器的技术。

从上面三种解决方案来看,目前JAVA EE提供了Session和Cookie两种解决方案。今天重点介绍Session技术。

第一:Session保存在服务器,是否和客户端无关系?

错,从奶茶店这个例子来看,商家想知道客户是否有消费,需要有一个前提条件,会员卡卡号。类比Session,也需要一个客户端的状态信息,就是JSession ID。这个ID值需要借助Cookie生成。

更简单一点理解,你就认为不同的机器或不同的浏览器会有一个特殊的算法生成一个JSessionID,这个作为服务器查询请求信息的凭证。

第二:Session保存在服务器,当客户端关闭时,是否Session将清空。

错,客户端关闭,服务器相差十万八千里,没法去监测客户端是否关闭。除非客户端在关闭时,主动和服务器通信。say:“服务器,我要关闭了,你把我Session清空掉吧”。要不然,服务器是没法去知道客户端已关闭。

再说,假若服务器能够知道客户端已关闭,试问现在BS模式,服务器得监听多大数据量的浏览器信息,压力山大。所以系统架构设计根本就不会考虑这种方案,除非特殊业务需求,例如很多服务器采用的“心跳”检测

第三:Session保存在服务器,这个数据是一直在服务器常驻吗?

错,如果常驻,那么这种系统架构设计方案绝对是需要否定的。因为这个数据是需要驻扎在内存中,如果一直长期存在,系统只会越来越慢。目前的解决方案是在web.xml中设置了系统的默认时间【30分钟】。当然代码也可以设置失效时间。

此处有疑问:30分钟是只能够用30分钟,还是说建立连接后,又重新恢复30分钟时间。

答案是只要与服务器连接,那么此时session将继续维持30分钟。假如有29分钟客户端未与服务器通信,但是第29分钟的时候请求了服务器,那么此时系统将session失效时间又恢复为30分钟。

第四:session.setAttribute方法怎么去理解,session不是说是一次请求连接吗?

session是客户与服务器通信,那么session就创建了。大家可以这么理解,session你从协议访问上可以理解是一次连接,因为它字面意思就是叫【会话】,但你从数据存储端来说,你就可以理解是在服务器内存分配一块存储。因此setAttribute方法就是相当于在存储中放置数据。

若setAttribute方法设置值成功,那么当客户端发送请求时,此时你认为客户端发送了一个客户端标识(JSessionID),服务器就利用该标识找到该客户端对应session存储所在位置,然后根据对应的name可以获取到设置的value值。

好了,Session基本的概念知识讲解到这,有什么问题请留言。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190817A0IN4300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券