是什么让 HttpSession 成为一个独特的 HTTP 客户端?

What makes a distinct HTTP client for HttpSession?

我理解 HttpSession (Servlet API document)

The servlet container uses this interface to create a session between an HTTP client and an HTTP server.

我想知道什么是独特的 HTTP 客户端?

希望回答能涵盖以下场景:

  1. 在同一个浏览器中打开新标签页是否会产生不同的客户端?
  2. 打开不同的浏览器会产生不同的客户端吗?
  3. 服务器定义不同 HTTP 客户端的规则是否在所有类型的服务器和客户端机器上通用并且OS?

这里要理解的根本是HTTP是一个无状态协议,即客户端与服务器建立连接,客户端发出请求,然后服务器给出响应,之后连接终止并“被遗忘”。由于 HTTP 本身,请求中的任何内容都不会转移到其他请求。

A session 是一种绕过 HTTP 基本限制的方法,一种将不同请求关联起来形成一种涉及许多请求的“对话”的方法。通过使用某种会话,客户端告诉服务器“嘿,我是之前和你说话的人”,服务器记住“是的,我记得你,让我们从我们离开的地方继续”。看起来微不足道,但 HTTP 没有这样做的自然方式。

例如,实现会话的一种非常常见的方式是使用 cookie。在第一次连接时,服务器向客户端发送一个 cookie,然后客户端在所有后续请求中发送相同的 cookie,以便服务器知道谁在说话。登录令牌、本地存储中的数据甚至隐藏的 HTML 字段也是建立会话的可能方式。这样的会话允许网络拥有登录页面并返回到登录状态。这也是为什么删除 cookie 会踢出网站,服务器不再知道你是谁。

所以,现在要回答具体问题:

I want to know what makes a distinct HTTP client?

不同客户端的唯一标识是“会话”。服务器只知道告诉他们 appart 或假设他们是相同的。如果会话标识符相同(例如,cookie),则服务器假定它是返回的客户端。如果没有提供 id,服务器会认为它是一个新客户端。

  1. Does opening a new tab in the same browser make a different client?

更多时候,不,是同一个。不同的选项卡共享 cookie 和本地存储,因此服务器将看到相同的标识符和 link 新选项卡到第一个选项卡。事实上,服务器对选项卡(甚至浏览器)一无所知,只会查看发送的请求。

异常:私人标签故意将 cookie 与普通标签隔离开来,不会发送它们。这就是为什么您需要在私人标签中再次登录。进入那里将创建第二个不同的会话标识符,服务器会将它们视为独立的。

另一个例外:某些浏览器,无论是原生的还是通过插件,也将 cookies/local 存储与某些选项卡隔离开来,正是为了实现多次登录。

  1. Does opening a different browser make a different client?

是的。浏览器不共享它们的内部状态,服务器也不会从一个浏览器获取另一个浏览器的会话 ID。除非您手动将 cookie 从一个复制到另一个。

  1. Is the rule for a server to define a distinct HTTP client universal across all types of servers and client machines and OS?

唯一“通用”的是,识别客户端的唯一依据是会话的概念,但它们的具体实现可能非常不同。会话 cookie 很常见,通常由应用程序框架提供,但远未普及。由于 HTTP 本身不定义状态,因此由每个应用程序来定义它。