由于 HTTP 是无状态协议,当客户端向服务器发出多个请求时,服务器如何在一段时间内唯一标识特定客户端的请求,例如 t1、t2、t3..
我浏览了网络并遇到了会话 ID、URL 重写和 cookie 等术语。但是,如果有人以更好的方式解释它,那就太好了。具体来说,HTTP 请求和响应的哪一部分将用于会话跟踪?
由于 HTTP 是无状态协议,当客户端向服务器发出多个请求时,服务器如何在一段时间内唯一标识特定客户端的请求,例如 t1、t2、t3..
我浏览了网络并遇到了会话 ID、URL 重写和 cookie 等术语。但是,如果有人以更好的方式解释它,那就太好了。具体来说,HTTP 请求和响应的哪一部分将用于会话跟踪?
正如您所提到的,实现 HTTP 会话跟踪的常用方法包括 URL 重写和 cookie。会话跟踪基本上要求在对服务器的多个请求中维护一个会话 ID。这意味着每次给定客户端向服务器发出请求时,它都会传递相同的会话 ID。服务器可以使用这个 ID 来查找它维护的会话信息。
使用 cookie 时,服务器通过设置Set-Cookie
HTTP 响应标头要求客户端存储 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,它可能会删除会话数据以保留资源。
具体来说,HTTP 请求和响应的哪一部分将用于会话跟踪?
在 HTTP 响应中,服务器可以设置一个 cookie。它使用 Set-Cookie 标头执行此操作。例如:
Set-Cookie: session=12345; path=/
然后,客户端返回所有与 cookie 一起设置的属性匹配的 cookie 的值,这些属性可以包括路径(如上)和域,并且尚未过期。
cookie 作为 HTTP 标头的一部分发送回服务器。例如:
Cookie: session=12345
没有任何原始属性信息与 cookie 一起发回。
唯一 cookie 允许服务器将唯一键与特定浏览器实例相关联。然后,服务器可以将该键用作哈希表或数据库表的索引,该表包含唯一的每用户状态信息。
会话跟踪是服务器端的事情。
Web 服务器发出一些返回给浏览器的会话标识符。浏览器与每个请求一起提交此会话标识符。
这可能是通过对用户透明地使用 cookie 来完成的。
在大多数情况下,会话处理是通过向客户端发送cookie来处理的。该 cookie 将在来自该特定客户端的每个请求中被发送回服务器。
将session id
与服务器端的一些资源(文件、内存空间)相关联,因此服务器通过读取session id
cookie 可以找到该资源,然后知道它是哪个客户端。
在这里找到足够的细节
HTTP 会话是推荐的方法。会话标识在会话期间源自同一浏览器的请求。所有的 servlet 可以共享同一个会话。JSESSIONID 由服务器生成,可以通过 cookie、URL 重写(如果 cookie 关闭)或内置 SSL 机制传递给客户端。应该注意最小化存储在会话中的对象的大小,并且存储在会话中的对象应该是可序列化的。在 Java servlet 中,可以按如下方式获取会话:
HttpSession 会话 = request.getSession(); //返回当前会话或新会话
会话可以超时(在 web.xml 中配置)或手动失效。
HTTP Session 允许 Web 服务器在客户端和我们的应用程序之间的多个请求/响应期间维护用户身份并存储用户特定数据