小博老师解析Java知识点-Session会话控制对象

[什么是Session]

Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

[Session的生命周期]

当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

 

[步骤解读一]理解Session会话级对象和页面级对象的区别

小博老师通过一个简单的案例,记录当前页面被访问的次数,可以让大家明显感觉到Session会话级对象和页面级对象的区别。

首先我们在项目中创建两个Servlet,分别为BWF01Servlet映射BWF01,BWF02Servlet映射BWF02,两个Servlet代码完全相同,核心代码如下:




页面展示效果如下:




我们首先使用Servlet的成员属性来存放页面被访问的次数,修改BWF01Servlet的代码如下:





我们在页面中点击多次“访问BWF01”超链接,页面访问次数累加,效果实现:



但是我们很容易理解,这样的实现方式,在BWF02Servlet中就无法使用visit的值,这样就无法实现在多个页面中保存公共数据了。接下来我们使用Session会话级对象来存放页面被访问的次数。修改BWF01Servlet和BWF02Servlet,代码完全相同,核心代码如下:



在页面中多次点击“访问BWF01”和“访问BWF02”超链接,发现在两个Servlet中可以累加访问次数,这就是Session会话级对象的作用,可以在多个页面之间持久存放公共数据。






[步骤解读二]理解Session“人手一份”的效果

Session会话级对象可以在多个页面之间持久存放公共数据,但是我们通过不同的客户端电脑(或同一台电脑中不同的浏览器)访问该页面时,我们会发现Session会话级对象中的数据是不互通的,这就是Session对于不同客户端有“人手一份”的效果。也就是说,对于每一个客户端,服务器会单独创建一份不同的Session会话级对象。







[步骤解读三]Session的客户身份识别符:Session_ID

我们都知道Http协议(超文本传输协议)是一种“无状态协议”,即客户端与服务器只在会话的瞬间是连接状态的,一旦会话结束后,客户端与服务器就会断开连接,服务器不会记得客户端,客户端下一次再向服务器发送请求,服务器会认为这是一次新的请求。

既然如此,Session是如何实现不同客户端“人手一份”的效果的呢?服务器又是如何在多次会话之间记住每个客户端需要用哪一份自己的Session的呢?

小博老师先给大家讲一个超市购物寄存背包的事情吧,我们都知道,进大型超市购物需要把随身携带的背包寄存起来吧,那么服务员只有一个人,客户有那么多,服务员是如何记住每一位客户寄存的背包放在哪里的呢?一般情况是这样的:当某个客户将背包寄存给服务员的时候,服务员会将存放这个背包的柜子钥匙(现在一般是电子密码……我们暂且认为就是一个客户的身份凭证)交给客户自己保管,客户购物完后回来取回包裹时,服务员会要求客户出示钥匙,根据钥匙找到相应的柜子,取出背包还给客户。其实服务员根本不认识客户,服务员之所以可以知道每个客户的背包在哪里,完全是靠钥匙(客户身份凭证)的匹配来实现的,而这个钥匙(客户身份凭证)是客户自己保存的。

其实服务器在为某个客户端创建Session会话级对象时,也会创建一个客户身份凭证(Session_ID),然后响应到客户端的时候,会把这个Session_ID存入到客户端(默认在Cookie中),下一次该客户端再向服务器发送请求时,会带上Cookie中的Session_ID提交给服务器,服务器其实不认识这个客户端,但是服务器可以通过客户端提交来的Session_ID,去服务器所有的Session对象中找到匹配Session_ID的那份Session对象来。





[步骤解读四]不基于Cookie实现Session:Cookieless Session

由于Session_ID默认存放在Cookie中,因此如果客户端浏览器禁用了Cookie,就会导致Session无法识别。这里要注意,Session并没有被销毁,仅仅是因为客户端发送请求时禁止带Cookie数据提交给服务器,服务器获取不到客户端的Session_ID身份凭证,无法匹配该客户端该使用哪一份Session。







这种时候我们一般可以选择不基于Cookie来实现Session,也就是把Session_ID不存放在Cookie中,比如说存放在URL中。我们修改BWF01Servlet核心代码如下:




此时,浏览器禁用Cookie后,多次点击“访问BWF01”超链接,Session数据可以识别,而多次点击“访问BWF02”超链接,Session数据不能识别。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值