[Java Web]会话跟踪技术

Posted 逐梦苍穹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java Web]会话跟踪技术相关的知识,希望对你有一定的参考价值。

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

目录

1、会话跟踪技术概述

  会话跟踪是一种网络应用程序中常用的技术,用于追踪单个用户的交互。
它允许应用程序在多个页面之间共享用户状态,并为每个用户提供个性化体验。
  会话跟踪可以通过多种方式实现,包括使用 cookie、URL 重写和隐藏表单域:

  1. Cookie:Cookie 是一种小型文本文件,由服务器发送到客户端浏览器,并存储在用户计算机上。当用户访问应用程序时,服务器会读取存储在 Cookie 中的信息,并根据这些信息来维护会话状态。Cookie 可以包含唯一标识符、过期时间和其他与会话相关的数据。
  2. URL 重写:URL 重写是一种在每个页面上将会话 ID 作为查询字符串参数添加到 URL 中的技术。服务器可以使用查询字符串参数来标识用户会话,并维护会话状态。URL 重写对于无法使用 cookie 的情况非常有用,例如,当用户禁用了 cookie 或者使用了不支持 cookie 的设备时。
  3. 隐藏表单域:隐藏表单域是一种在每个页面上将会话 ID 作为隐藏表单元素添加到 html 表单中的技术。当用户提交表单时,服务器可以使用隐藏表单域中的会话 ID 来标识用户,并维护会话状态。隐藏表单域对于处理敏感信息的应用程序非常有用,因为它可以防止会话 ID 在 URL 或 Cookie 中被泄露。

  无论使用哪种技术,会话跟踪都需要在服务器端存储会话状态。
  通常,服务器使用一个键值对存储会话状态,其中键是会话 ID,值是与会话相关的数据。会话数据可以包括用户 ID、购物车内容、最近访问的页面等。
  需要注意的是,会话跟踪可能存在一些安全问题,例如会话劫持和跨站脚本攻击(XSS)。为了保护应用程序免受这些攻击,需要使用安全的会话跟踪技术,例如使用随机生成的会话 ID、在会话 ID 上使用加密或签名,以及在输出会话数据时进行适当的转义和过滤。
  
拆分理解会话跟踪技术:
什么是会话:
  在计算机网络中,会话(Session)是指两个或多个设备之间的一段通信时间。它是指从设备之间建立连接开始,到连接关闭结束的一段时间内,这些设备之间的所有通信活动。
  在Web应用程序中,会话通常指的是一段时间内用户与Web服务器之间的通信,通常包括用户在网站上访问的所有页面、表单提交、HTTP请求和响应等操作。会话可以是一个单独的请求-响应事务,也可以是多个请求和响应事务的集合。
  
简单来说:会话就是,当用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
● 从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
● 会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着
● 浏览器和服务器就可以继续使用该会话进行请求发送和响应,上述的整个过程就被称之为会话
如下图,则建立了三个会话:

  每个浏览器都会与服务端建立了一个会话,加起来总共是3个会话
  
  会话跟踪,简单来说就是一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
● 服务器会收到多个请求,这多个请求可能来自多个浏览器,如上图中的6个请求来自3个浏览器
● 服务器需要用来识别请求是否来自同一个浏览器
● 服务器用来识别浏览器的过程,这个过程就是会话跟踪
● 服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据

2、数据共享

  通过对会话跟踪技术的概述中,可以发现,浏览器和服务器之间是不支持数据共享的,为什么?

原因如下:

  1. 浏览器和服务器之间使用的是HTTP请求来进行数据传输
  2. HTTP协议是无状态的,每次浏览器向服务器请求时,服务器会将该请求视为新的请求
  3. HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响
  4. 请求与请求之间独立后,就无法实现多次请求之间的数据共享

如何实现会话跟踪技术:

  1. 客户端会话跟踪技术:Cookie
  2. 服务端会话跟踪技术:Session

这两个技术实现会话跟踪的最大区别在于,Cookie是存储在浏览器端,而Session是存储在服务器端

3、Cookie

这部分内容,请移步我的另一篇文章:
[Java Web]Cookie | 一文详细介绍会话跟踪技术中的Cookie

4、Session

这部分内容,请移步我的另一篇文章:
[Java Web]Session | 一文详细介绍会话跟踪技术中的Session

5、Cookie和Session的区别

Session和Cookie都是在Web应用程序中维护客户端状态的机制,但它们有一些不同之处。

  1. 存储位置: Cookie存储在客户端的浏览器中,而Session存储在服务器上。
  2. 存储内容: Cookie只能存储少量的文本数据,而Session可以存储任意数据类型,包括对象和数组等。
  3. 安全性: Cookie数据容易被窃取和篡改,因为它存储在客户端浏览器中,可以被恶意脚本访问。Session数据存储在服务器上,只有服务器可以访问,因此更安全。
  4. 数据大小:Cookie最大存储3KB,而Session则无大小限制
  5. 生命周期: Cookie可以通过setMaxAge()设置过期时间以达到长期存储。Session通常会在客户端关闭浏览器或一定时间后自动过期,默认是存储30分钟。
  6. 处理方式: 在Web应用程序中,Cookie是由浏览器自动管理的,而Session是由Web应用程序开发人员手动管理的。
  7. 服务器性能:Cookie不占服务器资源,而Session则占用服务器资源

  总之,Session和Cookie都是用于在Web应用程序中维护客户端状态的机制。Cookie存储在客户端浏览器中,可以存储少量的文本数据,具有一定的安全风险;而Session存储在服务器上,可以存储任意数据类型,更安全,但需要开发人员手动管理。

6、总结

Cookie和Session各有千秋,但是在实际使用中如何选择,是有不同。综合上面提到的,总结在实际使用中,如何判断是使用Cookie存储还是使用Session存储:
以下是一些考虑因素:

  1. 数据大小: 如果要存储的数据较小,比如用户的偏好设置、上次登录时间等,可以考虑使用Cookie存储。
  2. 数据敏感性: 如果要存储的数据比较敏感,比如用户的身份认证信息、个人隐私信息等,建议使用Session存储,因为Session数据存储在服务器上,更加安全。
  3. 跨站点数据访问: 如果需要在多个域名或子域名之间共享数据,可以考虑使用Cookie存储,因为Cookie可以在不同的域名之间共享数据。Session则只能在同一个域名下共享数据。
  4. 有效期: 如果需要在客户端浏览器关闭后或过一定时间后删除数据,可以考虑使用Cookie存储。如果需要在整个会话期间都保留数据,可以使用Session存储。

总之,在实际使用中,需要根据具体情况来选择使用Cookie存储还是Session存储,考虑因素包括数据大小、数据敏感性、跨站点数据访问和有效期等。

Web开发中,用到的4种会话跟踪技术

会话跟踪:主要解决HTTP的无状态问题,即:

当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。当一个客户在多个页面间切换时,服务器会保存该用户的信息。

1.Cookie:

        可以使用 cookie 存储购物会话的 ID;在后续连接中,取出当前的会话 ID,并使用这个 ID 从服务器上的查找表(lookup table)中提取出会话的相关信息。 以这种方式使用 cookie 是一种绝佳的解决方案,也是在处理会话时最常使用的方式。但是,sevlet 中最好有一种高级的 API 来处理所有这些任务,以及下面这些冗长乏味的任务:从众多的其他cookie中(毕竟可能会存在许多cookie)提取出存储会话标识符的 cookie;确定空闲会话什么时候过期,并回收它们;将散列表与每个请求关联起来;生成惟一的会话标识符.


2.URL重写:

        采用这种方式时,客户程序在每个URL的尾部添加一些额外数据。这些数据标识当前的会话,服务器将这个标识符与它存储的用户相关数据关联起来。 URL重写是比较不错的会话跟踪解决方案,即使浏览器不支持 cookie 或在用户禁用 cookie 的情况下,这种方案也能够工作。

       URL 重写具有 cookie 所具有的同样缺点,也就是说,服务器端程序要做许多简单但是冗长乏味的处理任务。即使有高层的 API 可以处理大部分的细节,仍须十分小心每个引用你的站点的 URL ,以及那些返回给用户的 URL。即使通过间接手段,比如服务器重定向中的 Location 字段,都要添加额外的信息。这种限制意味着,在你的站点上不能有任何静态 HTML 页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用 servlet 或 JSP 动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息也会丢失,因为存储下来的链接含有错误的标识信息。

3.隐藏的表单域:

        HTML 表单中可以含有如下的条目:<input type="hidden" name="session" value="a1234">

        这个条目的意思是:在提交表单时,要将指定的名称和值自动包括在 GET 或 POST 数据中。这个隐藏域可以用来存储有关会话的信息,但它的主要缺点是:仅当每个页面都是由表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程。


4.session:

       信息保存在服务器端

       使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话

以上是关于[Java Web]会话跟踪技术的主要内容,如果未能解决你的问题,请参考以下文章

Java:跟踪用户登录会话 - 会话 EJB 与 HTTPSession

Java Web 会话机制,Cookie和Session详解

java 会话跟踪技术

会话跟踪之Cookie技术

Web会话跟踪:Cookie与Session

Web开发中,用到的4种会话跟踪技术