16

我真的不明白何时创建会话以及创建会话的实体(每个 ip、每个浏览器、每个登录用户)。我在文档中看到默认情况下会为每个访问者创建会话 - 但什么是访问者(浏览器或 ip)?

4

2 回答 2

16

什么是 HTTP 会话?

要显示网页,您的浏览器会向服务器发送HTTP请求,服务器会发回 HTTP 响应。每次您单击网站上的链接时,都会发生一个新的 HTTP 事务,即它不是一个长期持续的连接(如电话)。您与网站的通信包含许多单一的 HTTP 事务(数十或数百个电话,每个电话只有几个字)。

那么服务器如何记住有关用户的信息,例如用户登录(IP 地址不可靠)?第一次访问网站时,服务器会创建一个随机字符串,并在 HTTP 响应中要求浏览器使用该值创建一个所谓的 HTTP cookie。cookie 实际上只是(cookie 的)名称和值。如果您访问一个简单的启用会话的 Django 站点,服务器将要求您的浏览器设置一个名为“sessionid”的 cookie,该 cookie 具有这样一个随机生成的值。

FireBug 网络选项卡的屏幕截图,同时向 Django 站点发出第一个请求。 它显示了如何设置 HTTP cookie。

随后,您的浏览器将向该域发出 HTTP 请求,它将在 HTTP 请求中包含 cookie。

显示后续请求将如何包含在初始事务中设置的 cookie。

服务器保存这些会话 ID(对于 django,默认是保存在数据库中)并将它们与所谓的会话变量一起保存。因此,基于与 HTTP 请求一起发送的会话 ID,它可以挖掘出先前设置的会话变量以及修改或添加会话变量。如果您删除 cookie(在 Firefox 中按 ctrl+shift+delete),您将意识到没有网站会再记住您(Gmail、Facebook、Django 网站等),您必须重新登录。大多数浏览器将允许您在一般情况下或针对特定网站(出于隐私原因)禁用 cookie,但这意味着您无法登录这些网站。

每个浏览器、每个窗口、每个选项卡、每个 IP?

It is not possible to log into different GMail accounts within the same browser, not even from different windows. But it is possible to log in to one account with Firefox and another with Chrome. So the answer is: per browser. However, it is not always that simple. You can use different profiles in Firefox, and each can keep different cookies and thus you can log into different accounts simultaneously. There are also Firefox plugins for keeping multiple sessions, e.g. MultiFox.

The session all depends on which session cookie your browser sends in it's HTTP request.

Play around

为了全面了解正在发生的事情,我建议为 Firefox 安装FireBugFireCookie插件。以上截图取自 FireBug 的网络面板。FireCookie 将在您访问网站时为您提供设置 cookie 的时间和设置的概览,并让您控制允许的 cookie。

如果出现服务器端错误,并且您的 DEBUG=True,则 Django 错误消息将显示有关 HTTP 请求的信息,包括发送的 cookie

在此处输入图像描述

于 2012-06-17T07:09:21.460 回答
13

它是浏览器(不是IP)。会话基本上是存储在服务器上的数据,由作为 cookie 发送到浏览器的会话 ID 标识。浏览器将在所有后续请求中发回包含会话 ID 的 cookie,直到浏览器关闭或 cookie 过期(取决于与 cookie 标头一起发送的 expires 值,您可以通过 Django 使用 set_expiry 控制该值)。

服务器也可以通过基本上忽略浏览器发送的(未过期的)cookie 并要求启动新会话来使会话过期。

这里有关于会话如何工作的很好的描述。

于 2012-06-15T17:45:44.957 回答