会话跟踪。

会话跟踪(Session tracking)是网络程序设计中的一项重要技术,它是在用户多次访问网站或应用程序时保持特定用户信息的一种方式。在HTTP这种无状态协议下,服务器需要一种机制来识别同一用户多次请求的关联性,会话跟踪技术就是这样一种机制。

以下是一些常用的会话跟踪技术:

  1. Cookie技术:这是一种在客户端保存用户信息的技术,服务器在需要的时候发送一个Cookie到用户的浏览器,浏览器在下次访问同一服务器时将此Cookie发送回服务器,从而服务器可以知道此次请求与之前的请求是否来自同一用户。
  2. URL重写:这是一种在客户端不接受Cookie时的备选方案。通过将会话ID添加到URL中,可以让服务器识别出这是同一个用户的多次请求。
  3. 隐藏域:在HTML表单中,可以添加隐藏字段来存储用户的会话信息,当用户提交表单时,服务器可以从隐藏域中获取会话信息。
  4. HttpSession:这是Java Servlet API中的一个接口,它提供了一种在服务器端保存用户信息的方式,服务器可以为每个用户创建一个HttpSession对象,当用户的请求到达服务器时,服务器可以通过用户的请求获取用户的HttpSession对象。
  5. IP跟踪:基于用户的IP地址来跟踪用户的会话,但是由于很多用户使用动态IP或者在同一个局域网中,这种方式并不可靠。
  6. Web存储:HTML5引入了两种新的Web存储技术,即本地存储(localStorage)和会话存储(sessionStorage)。这两种存储方式允许你在用户的浏览器中保存更大量的数据,而且有着比Cookie更好的安全性和性能。
  7. JWT (JSON Web Token):这是一种在网络上传输信息的方式,可以将用户的会话信息打包成一个token,然后将这个token传给用户。当用户下次访问服务器时,只需要带上这个token,服务器就可以知道用户的会话信息。

以上就是一些常见的会话跟踪技术,具体使用哪种技术取决于应用的需求和环境。


重点说下其中的四个技术:Cookie技术、HttpSesion、Web存储、JWT(JSON Web Token)

Cookie技术

Cookie是由W3C组织提出,最早由netscape社区发展的一种机制。

网页交互是通过HTTP协议传输数据的,而Http协议是无状态的协议。无状态的协议是什么意思呢?一旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接

服务器无法确认用户的信息,于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。

Cookie的流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器

Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。

Cookie存储的方式类似于Map集合Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie

Cookie的隐私安全机制决定Cookie是不可跨域名的。也就是说www.baidu.com和www.google.com之间的Cookie是互不交接的。即使是同一级域名,不同二级域名也不能交接,也就是说:www.goole.com和www.image.goole.com的Cookie也不能访问


HttpSesion

Session比Cookie使用方便,Session可以解决Cookie解决不了的事情【Session可以存储对象,Cookie只能存储字符串。】。

Session有着request和ServletContext类似的方法。其实Session也是一个域对象。Session作为一种记录浏览器状态的机制,只要Session对象没有被销毁,Servlet之间就可以通过Session对象实现通讯

Session在用户第一次访问服务器Servlet,jsp等动态资源就会被自动创建,Session对象保存在内存里,这也就为什么可以直接使用request对象获取得到Session对象。如果访问HTML,IMAGE等静态资源Session不会被创建。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,无论是否对Session进行读写,服务器都会认为Session活跃了一次

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为了防止内存溢出,服务器会把长时间没有活跃的Session从内存中删除,这个时间也就是Session的超时时间

Session的超时时间默认是30分钟。但可以修改。

服务器是如何实现一个session为一个用户浏览器服务的?换个说法:为什么服务器能够为不同的用户浏览器提供不同session?

HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同一个用户。

简单来说:Session 之所以可以识别不同的用户,依靠的就是Cookie

该Cookie是服务器自动颁发给浏览器的,不用我们手工创建的。该Cookie的maxAge值默认是-1,也就是说仅当前浏览器使用,不将该Cookie存在硬盘中

上面说了Session是依靠Cookie来识别用户浏览器的。如果我的用户浏览器禁用了Cookie了呢?绝大多数的手机浏览器都不支持Cookie,那我的Session怎么办?Java Web提供了解决方法:URL地址重写