31

由于 HTTP 是无状态协议,当客户端向服务器发出多个请求时,服务器如何在一段时间内唯一标识特定客户端的请求,例如 t1、t2、t3..

我浏览了网络并遇到了会话 ID、URL 重写和 cookie 等术语。但是,如果有人以更好的方式解释它,那就太好了。具体来说,HTTP 请求和响应的哪一部分将用于会话跟踪?

4

6 回答 6

44

正如您所提到的,实现 HTTP 会话跟踪的常用方法包括 URL 重写和 cookie。会话跟踪基本上要求在对服务器的多个请求中维护一个会话 ID。这意味着每次给定客户端向服务器发出请求时,它都会传递相同的会话 ID。服务器可以使用这个 ID 来查找它维护的会话信息。

使用 cookie 时,服务器通过设置Set-CookieHTTP 响应标头要求客户端存储 cookie。此 cookie 包含分配给该客户端的唯一会话 ID - 在此示例中为字符串“ABAD1D”:

    Set-Cookie: JSESSIONID=ABAD1D;path=/

然后,客户端使用每个请求的 HTTP 请求标头将 cookie 发送回服务器Cookie,因此服务器会在每个请求上获知当前分配给客户端的会话 ID。

    Cookie: JSESSIONID=ABAD1D

当使用 URL 重写时,这个相同的会话 ID 会被发送到 URL 中的某个地方。同样,服务器从 URL 中提取会话 ID,以便它可以查找特定客户端的会话:

    http://my.app.com/index.jsp;JSESSIONID=ABAD1D

但是,服务器还必须确保发送回客户端的网页中的任何 URL 也被重写以包含该特定客户端会话 ID。由于会话 ID 编码在 URL 中,因此这种会话跟踪方法对浏览器是透明的。如果服务器发现它无法在客户端上设置会话 cookie,通常会诉诸 URL 重写——这意味着客户端不支持/允许 cookie。

请注意,会话可能会过期。这意味着如果服务器在一段时间内没有“看到”给定的会话 ID,它可能会删除会话数据以保留资源。

于 2009-11-16T08:50:56.897 回答
10

具体来说,HTTP 请求和响应的哪一部分将用于会话跟踪?

在 HTTP 响应中,服务器可以设置一个 cookie。它使用 Set-Cookie 标头执行此操作。例如:

Set-Cookie: session=12345; path=/

然后,客户端返回所有与 cookie 一起设置的属性匹配的 cookie 的值,这些属性可以包括路径(如上)和域,并且尚未过期。

cookie 作为 HTTP 标头的一部分发送回服务器。例如:

Cookie: session=12345

没有任何原始属性信息与 cookie 一起发回。

唯一 cookie 允许服务器将唯一键与特定浏览器实例相关联。然后,服务器可以将该键用作哈希表或数据库表的索引,该表包含唯一的每用户状态信息。

于 2009-11-16T08:57:04.200 回答
1

会话跟踪是服务器端的事情。

Web 服务器发出一些返回给浏览器的会话标识符。浏览器与每个请求一起提交此会话标识符。

这可能是通过对用户透明地使用 cookie 来完成的。

于 2009-11-16T08:43:40.900 回答
1

在大多数情况下,会话处理是通过向客户端发送cookie来处理的。该 cookie 将在来自该特定客户端的每个请求中被发送回服务器。

session id与服务器端的一些资源(文件、内存空间)相关联,因此服务器通过读取session idcookie 可以找到该资源,然后知道它是哪个客户端。

于 2009-11-16T08:43:55.437 回答
1

在这里找到足够的细节

HTTP 会话是推荐的方法。会话标识在会话期间源自同一浏览器的请求。所有的 servlet 可以共享同一个会话。JSESSIONID 由服务器生成,可以通过 cookie、URL 重写(如果 cookie 关闭)或内置 SSL 机制传递给客户端。应该注意最小化存储在会话中的对象的大小,并且存储在会话中的对象应该是可序列化的。在 Java servlet 中,可以按如下方式获取会话:

HttpSession 会话 = request.getSession(); //返回当前会话或新会话

会话可以超时(在 web.xml 中配置)或手动失效。

于 2015-12-16T18:11:08.373 回答
0

HTTP Session 允许 Web 服务器在客户端和我们的应用程序之间的多个请求/响应期间维护用户身份并存储用户特定数据

于 2020-05-20T08:21:48.223 回答