[Java Web]Session | 一文详细介绍会话跟踪技术中的Session

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:Java Web

目录

  • Session
  • 1、介绍
  • 2、工作流程
  • 3、工作原理
  • 4、基本使用
  • 5、Session的钝化与活化
    • 5.1、提出问题
    • 5.2、解决问题
  • 6、Session销毁

Session

1、介绍

简单概述Session:

  1. 服务端会话跟踪技术:将数据保存到服务端。
  2. Session是存储在服务端而Cookie是存储在客户端
  3. 存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
  4. 存储在服务端的数据相比于客户端来说就更安全

详细介绍:
  Session(会话)是一个在Web应用程序中跨多个请求维护客户端状态的机制。在Web应用程序中,HTTP协议是无状态的,这意味着每个请求都是独立的,服务器不能识别不同请求之间的关联。Session解决了这个问题,它允许Web应用程序在客户端和服务器之间存储和共享状态数据。
  当客户端第一次访问Web应用程序时,服务器会创建一个唯一的会话ID,并将其存储在客户端的Cookie中。
  会话ID通常是一个长的随机字符串,用于识别客户端。每个后续请求都将包含这个会话ID,使得服务器能够识别客户端,并且能够在不同请求之间共享数据。
  在会话中,可以存储任意数据,例如用户信息、购物车内容等。服务器会将这些数据存储在内存或持久化存储中(如数据库或文件系统),并且只在会话有效期内保留。通常情况下,会话有效期是30分钟到几个小时,但可以根据需要进行配置。
  总之,Session是一种在Web应用程序中维护客户端状态的机制,它通过在客户端和服务器之间存储和共享状态数据,解决了HTTP协议无状态的问题。

2、工作流程

[Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第1张图片

  1. 在服务端的ServletA获取一个Session对象,把数据存入其中
  2. 在服务端的ServletB获取到相同的Session对象,从中取出数据,就可以实现一次会话中多次请求之间的数据共享了

那么如何保证ServletA和ServletB使用的是同一个Session对象?下面进行原理分析

3、工作原理

前提条件:Session是基于Cookie实现的

Session的工作原理如下:

  1. 当客户端第一次访问Web应用程序时,服务器会创建一个唯一的Session ID,这个Session ID通常是一个长的随机字符串。
  2. 服务器将Session ID存储在Cookie中,并将Cookie发送给客户端浏览器。客户端浏览器会将Cookie保存在本地,并在后续的每个请求中发送给服务器。
  3. 当客户端发送一个请求时,服务器会读取请求中的Session ID,并使用它来查找与该Session ID相关联的Session对象。
  4. 如果服务器找到了Session对象,它将使用该对象存储和读取与该会话相关的数据。如果服务器没有找到Session对象,则会创建一个新的Session对象,并将其与Session ID相关联。
  5. 服务器会将Session对象存储在内存或持久化存储中(如数据库或文件系统),并在会话过期之前保留它。
  6. 当客户端关闭浏览器或者Session过期后,服务器会删除该Session对象,并释放与之相关联的资源。关闭打开浏览器后,因为浏览器的cookie已被销毁,所以就没有JESSIONID的数据,服务端获取到的session就是一个全新的session对象

总之,Session的工作原理是通过在客户端浏览器和服务器之间传递Session ID来维护客户端状态,并在服务器上存储和共享会话数据,以便跨多个请求共享和使用该数据。

4、基本使用

在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。

具体的使用步骤为:

  1. 使用request对象获取Session对象->HttpSession session = request.getSession();
  2. 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并存储数据:
[Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第2张图片

创建SessionDemo2并获取数据:
[Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第3张图片

启动Tomcat服务器,访问sessionDemo1,然后再访问sessionDemo2,查看控制台,可以看到:
[Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第4张图片

此时查看浏览器缓存的Cookie:
[Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第5张图片
下面在代码中测试两次获取的Session是不是同一个对象:

可以看到,是同一个对象。这是通过第一次获取对象生成的JESSIONID唯一标识来识别的。

前面讲工作原理的时候提到,如果把浏览器关闭或者开启新的会话窗口,那么Session对象就会不一样。同时,如果把浏览器关闭再重新打开,去查看浏览器缓存的Cookie时,会发现之前存储的Session对象的Cookie被销毁了。

这也很好的印证了:Session是基于Cookie实现的,Session本质上还是实现的同个会话中的数据共享。

5、Session的钝化与活化

5.1、提出问题

服务器重启后,Session对象存储的数据是否还在?
  按照上面讲到的,服务器重启的时候,同时也释放了内存,那么Session存储的数据也应该是被销毁了。

举个例子简单引入:
  用户把需要购买的商品添加到购物车,因为要实现同一个会话多次请求数据共享,所以假设把数据存入Session对象中。此时用户有事离开一会,在这期间服务器重启了,等用户回来结算的时候发现购物车的数据没了,那么这显然不符合我们日常的需求。

但是实际上,Tomcat服务器在正常关闭和重启的时候,Session的数据并不会被销毁。

5.2、解决问题

如何实现:Session的钝化和活化

  1. 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
    钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser
  2. 活化:再次启动服务器后,从文件中加载数据到Session中。
    数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉

6、Session销毁

  
session的销毁有两种方式:

  1. 默认情况下,无操作,30分钟自动销毁
    a. 对于这个失效时间,是可以通过配置进行修改的
    b. 在项目的web.xml中配置
    [Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第6张图片
    c. 如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中:
    [Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第7张图片

  2. 调用Session对象的invalidate()进行销毁
    a.在SessionDemo2类中添加session销毁的方法
    [Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第8张图片
    再次访问服务器,会发现对象已经被销毁了。
    [Java Web]Session | 一文详细介绍会话跟踪技术中的Session_第9张图片
    b.在实际使用中,该销毁方法一般会在用户退出的时候,需要将session销毁掉。

你可能感兴趣的:(Java,Web,java,前端,服务器,Session)