⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:Java Web
目录
- Session
- 1、介绍
- 2、工作流程
- 3、工作原理
- 4、基本使用
- 5、Session的钝化与活化
- 5.1、提出问题
- 5.2、🔺解决问题
- 6、Session销毁
Session
1、介绍
简单概述Session:
- 服务端会话跟踪技术:将数据保存到服务端。
- Session是存储在服务端而Cookie是存储在客户端
- 存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
- 存储在服务端的数据相比于客户端来说就更安全
详细介绍:
Session(会话)是一个在Web应用程序中跨多个请求维护客户端状态的机制。在Web应用程序中,HTTP协议是无状态的,这意味着每个请求都是独立的,服务器不能识别不同请求之间的关联。Session解决了这个问题,它允许Web应用程序在客户端和服务器之间存储和共享状态数据。
当客户端第一次访问Web应用程序时,服务器会创建一个唯一的会话ID,并将其存储在客户端的Cookie中。
会话ID通常是一个长的随机字符串,用于识别客户端。每个后续请求都将包含这个会话ID,使得服务器能够识别客户端,并且能够在不同请求之间共享数据。
在会话中,可以存储任意数据,例如用户信息、购物车内容等。服务器会将这些数据存储在内存或持久化存储中(如数据库或文件系统),并且只在会话有效期内保留。通常情况下,会话有效期是30分钟到几个小时,但可以根据需要进行配置。
总之,Session是一种在Web应用程序中维护客户端状态的机制,它通过在客户端和服务器之间存储和共享状态数据,解决了HTTP协议无状态的问题。
2、工作流程
- 在服务端的ServletA获取一个Session对象,把数据存入其中
- 在服务端的ServletB获取到相同的Session对象,从中取出数据,就可以实现一次会话中多次请求之间的数据共享了
那么如何保证ServletA和ServletB使用的是同一个Session对象?下面进行原理分析
3、工作原理
前提条件:Session是基于Cookie实现的
Session的工作原理如下:
- 当客户端第一次访问Web应用程序时,服务器会创建一个唯一的Session ID,这个Session ID通常是一个长的随机字符串。
- 服务器将Session ID存储在Cookie中,并将Cookie发送给客户端浏览器。客户端浏览器会将Cookie保存在本地,并在后续的每个请求中发送给服务器。
- 当客户端发送一个请求时,服务器会读取请求中的Session ID,并使用它来查找与该Session ID相关联的Session对象。
- 如果服务器找到了Session对象,它将使用该对象存储和读取与该会话相关的数据。如果服务器没有找到Session对象,则会创建一个新的Session对象,并将其与Session ID相关联。
- 服务器会将Session对象存储在内存或持久化存储中(如数据库或文件系统),并在会话过期之前保留它。
- 当客户端关闭浏览器或者Session过期后,服务器会删除该Session对象,并释放与之相关联的资源。关闭打开浏览器后,因为浏览器的cookie已被销毁,所以就没有JESSIONID的数据,服务端获取到的session就是一个全新的session对象
总之,Session的工作原理是通过在客户端浏览器和服务器之间传递Session ID来维护客户端状态,并在服务器上存储和共享会话数据,以便跨多个请求共享和使用该数据。
4、基本使用
在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。
具体的使用步骤为:
- 使用request对象获取Session对象->HttpSession session = request.getSession();
- Session对象提供的功能:
a. 存储数据到session域中->void setAttribute(String name,Object o)
b. 根据Key获取值->Object getAttribute(String name)
c. 根据Key删除该键值对->void removeAttribute(String name)
下面通过一个简单Demo来实现Session的简单使用:
需求:在一个Servlet中往Session中存入数据,在另一个Servlet中获取Session中存入的数据
1.创建名为SessionDemo1的Servlet类
2.创建名为SessionDemo2的Servlet类
3.在SessionDemo1的方法中:获取Session对象、存储数据
4.在SessionDemo2的方法中:获取Session对象、获取数据
5.启动测试
创建SessionDemo1并存储数据:
创建SessionDemo2并获取数据:
启动Tomcat服务器,访问sessionDemo1,然后再访问sessionDemo2,查看控制台,可以看到:
此时查看浏览器缓存的Cookie:
下面在代码中测试两次获取的Session是不是同一个对象:
可以看到,是同一个对象。这是通过第一次获取对象生成的JESSIONID唯一标识来识别的。
前面讲工作原理的时候提到,如果把浏览器关闭或者开启新的会话窗口,那么Session对象就会不一样。同时,如果把浏览器关闭再重新打开,去查看浏览器缓存的Cookie时,会发现之前存储的Session对象的Cookie被销毁了。
这也很好的印证了:Session是基于Cookie实现的,Session本质上还是实现的同个会话中的数据共享。
5、Session的钝化与活化
5.1、提出问题
服务器重启后,Session对象存储的数据是否还在?
按照上面讲到的,服务器重启的时候,同时也释放了内存,那么Session存储的数据也应该是被销毁了。
举个例子简单引入:
用户把需要购买的商品添加到购物车,因为要实现同一个会话多次请求数据共享,所以假设把数据存入Session对象中。此时用户有事离开一会,在这期间服务器重启了,等用户回来结算的时候发现购物车的数据没了,那么这显然不符合我们日常的需求。
但是实际上,Tomcat服务器在正常关闭和重启的时候,Session的数据并不会被销毁。
5.2、🔺解决问题
如何实现:Session的钝化和活化
- 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser - 活化:再次启动服务器后,从文件中加载数据到Session中。
数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉
6、Session销毁
session的销毁有两种方式:
-
默认情况下,无操作,30分钟自动销毁
a. 对于这个失效时间,是可以通过配置进行修改的
b. 在项目的web.xml中配置
c. 如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中:
-
调用Session对象的invalidate()进行销毁
a.在SessionDemo2类中添加session销毁的方法
再次访问服务器,会发现对象已经被销毁了。
b.在实际使用中,该销毁方法一般会在用户退出的时候,需要将session销毁掉。