⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:Java Web
简单概述Session:
详细介绍:
Session(会话)是一个在Web应用程序中跨多个请求维护客户端状态的机制。在Web应用程序中,HTTP协议是无状态的,这意味着每个请求都是独立的,服务器不能识别不同请求之间的关联。Session解决了这个问题,它允许Web应用程序在客户端和服务器之间存储和共享状态数据。
当客户端第一次访问Web应用程序时,服务器会创建一个唯一的会话ID,并将其存储在客户端的Cookie中。
会话ID通常是一个长的随机字符串,用于识别客户端。每个后续请求都将包含这个会话ID,使得服务器能够识别客户端,并且能够在不同请求之间共享数据。
在会话中,可以存储任意数据,例如用户信息、购物车内容等。服务器会将这些数据存储在内存或持久化存储中(如数据库或文件系统),并且只在会话有效期内保留。通常情况下,会话有效期是30分钟到几个小时,但可以根据需要进行配置。
总之,Session是一种在Web应用程序中维护客户端状态的机制,它通过在客户端和服务器之间存储和共享状态数据,解决了HTTP协议无状态的问题。
那么如何保证ServletA和ServletB使用的是同一个Session对象?下面进行原理分析
前提条件:Session是基于Cookie实现的
Session的工作原理如下:
总之,Session的工作原理是通过在客户端浏览器和服务器之间传递Session ID来维护客户端状态,并在服务器上存储和共享会话数据,以便跨多个请求共享和使用该数据。
在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。
具体的使用步骤为:
下面通过一个简单Demo来实现Session的简单使用:
需求:在一个Servlet中往Session中存入数据,在另一个Servlet中获取Session中存入的数据
1.创建名为SessionDemo1的Servlet类
2.创建名为SessionDemo2的Servlet类
3.在SessionDemo1的方法中:获取Session对象、存储数据
4.在SessionDemo2的方法中:获取Session对象、获取数据
5.启动测试
启动Tomcat服务器,访问sessionDemo1,然后再访问sessionDemo2,查看控制台,可以看到:
此时查看浏览器缓存的Cookie:
下面在代码中测试两次获取的Session是不是同一个对象:
可以看到,是同一个对象。这是通过第一次获取对象生成的JESSIONID唯一标识来识别的。
前面讲工作原理的时候提到,如果把浏览器关闭或者开启新的会话窗口,那么Session对象就会不一样。同时,如果把浏览器关闭再重新打开,去查看浏览器缓存的Cookie时,会发现之前存储的Session对象的Cookie被销毁了。
这也很好的印证了:Session是基于Cookie实现的,Session本质上还是实现的同个会话中的数据共享。
服务器重启后,Session对象存储的数据是否还在?
按照上面讲到的,服务器重启的时候,同时也释放了内存,那么Session存储的数据也应该是被销毁了。
举个例子简单引入:
用户把需要购买的商品添加到购物车,因为要实现同一个会话多次请求数据共享,所以假设把数据存入Session对象中。此时用户有事离开一会,在这期间服务器重启了,等用户回来结算的时候发现购物车的数据没了,那么这显然不符合我们日常的需求。
但是实际上,Tomcat服务器在正常关闭和重启的时候,Session的数据并不会被销毁。
如何实现:Session的钝化和活化
session的销毁有两种方式: