HTTP会话跟踪

33

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

我浏览了网页,看到了诸如会话ID、URL重写和Cookie等术语。但如果有人能更好地解释一下就太好了。具体来说,在HTTP请求和响应的哪个部分将用于会话跟踪?


以ASP.NET为例,参见http://www.codeproject.com/KB/aspnet/SessionTimeoutOnDNN.aspx中的图1。 - Ricky
6个回答

49

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

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

    Set-Cookie: JSESSIONID=ABAD1D;path=/

然后,客户端使用每个请求中的 Cookie HTTP 请求头将 cookie 发送回服务器,从而通知服务器当前分配给客户端的会话 ID。

    Cookie: JSESSIONID=ABAD1D

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

    http://my.app.com/index.jsp;JSESSIONID=ABAD1D
然而,服务器还必须确保返回给客户端的网页中的任何URL也被重写以包含该特定客户端的会话ID。由于会话ID被编码在URL中,因此这种会话跟踪方法对浏览器是透明的。如果服务器发现无法在客户端上设置会话cookie(即客户端不支持/允许cookie),通常会使用URL重写。
请注意,会话可能会过期。这意味着如果服务器在一段时间内没有看到给定的会话ID,则可能会删除会话数据以保留资源。

11

会话跟踪需要使用HTTP请求和响应的具体部分是什么?

在HTTP响应中,服务器可以设置一个cookie。它使用Set-Cookie头来实现。例如:

Set-Cookie: session=12345; path=/

客户端将返回与设置的cookie属性匹配且尚未过期的所有cookie值,其中可能包括路径(如上所述)和域。

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

Cookie: session=12345

在cookie中不会发送任何原始属性信息。

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


1

在这里可以找到足够的细节here

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

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

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


1

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

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

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


1

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

会话ID将与服务器端的某些资源(文件、RAM空间)相关联,因此服务器可以通过读取cookie中的会话ID找到此资源,然后知道是哪个客户端。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接