【发布时间】:2012-06-18 19:37:23
【问题描述】:
我真的不明白会话何时创建以及创建的实体(每个 ip、每个浏览器、每个登录用户)。我在文档中看到默认情况下为每个访问者创建会话 - 但访问者是什么(浏览器或 IP)?
【问题讨论】:
-
+1 表示好问题。从来没有想过这个。没有django方便的atm,但是可以查看会话表吗?实际上,我从来没有看过那些默认的 django 表,如果它们被创建的话......
我真的不明白会话何时创建以及创建的实体(每个 ip、每个浏览器、每个登录用户)。我在文档中看到默认情况下为每个访问者创建会话 - 但访问者是什么(浏览器或 IP)?
【问题讨论】:
要显示网页,您的浏览器会向服务器发送HTTP 请求,服务器会发回 HTTP 响应。每次您单击网站上的链接时,都会发生新的 HTTP 事务,即它不是随时间持续存在的连接(如电话)。您与网站的通信包含许多单一的 HTTP 事务(数十或数百个电话,每个电话只有几个字)。
那么服务器如何记住用户的信息,例如用户登录(IP 地址不可靠)?第一次访问网站时,服务器会创建一个随机字符串,并在 HTTP 响应中要求浏览器使用该值创建一个所谓的 HTTP cookie。 cookie 实际上只是(cookie 的)名称和值。如果您访问一个简单的启用会话的 Django 站点,服务器将要求您的浏览器设置一个名为“sessionid”的 cookie,该 cookie 具有这样一个随机生成的值。
您的浏览器随后会向该域发出 HTTP 请求,它将在 HTTP 请求中包含 cookie。
服务器保存这些会话 ID(对于 django,默认是保存在数据库中)并将它们与所谓的会话变量一起保存。因此,基于与 HTTP 请求一起发送的会话 ID,它可以挖掘出先前设置的会话变量以及修改或添加会话变量。如果您删除 cookie(在 Firefox 中按 ctrl+shift+delete),您将意识到没有网站会再记住您(Gmail、Facebook、Django 网站等),您必须重新登录。大多数浏览器将允许您在一般情况下或针对特定网站(出于隐私原因)禁用 cookie,但这意味着您无法登录这些网站。
不可能在同一个浏览器中登录不同的 GMail 帐户,即使是从不同的窗口也是如此。但是可以用 Firefox 登录一个帐户,用 Chrome 登录另一个帐户。所以答案是:每个浏览器。然而,事情并不总是那么简单。您可以在 Firefox 中使用不同的配置文件,每个配置文件可以保存不同的 cookie,因此您可以同时登录不同的帐户。还有用于保持多个会话的 Firefox 插件,例如MultiFox。
会话完全取决于您的浏览器在其 HTTP 请求中发送的会话 cookie。
为了全面了解正在发生的事情,我建议为 Firefox 安装 FireBug 和 FireCookie 插件。以上截图取自 FireBug 的网络面板。 FireCookie 将在您访问网站时为您提供设置 cookie 的时间和设置的概览,并让您控制允许的 cookie。
如果出现服务器端错误,并且您的 DEBUG=True,那么 Django 错误消息将显示有关 HTTP 请求的信息,包括发送的 cookie
【讨论】:
它是浏览器(不是 IP)。会话基本上是存储在服务器上的数据,由作为 cookie 发送到浏览器的会话 ID 标识。浏览器将在所有后续请求中发回包含会话 ID 的 cookie,直到浏览器关闭或 cookie 过期(取决于与 cookie 标头一起发送的 expires 值,您可以通过 Django 使用 set_expiry 进行控制)。
服务器也可以通过基本上忽略浏览器发送的(未过期的)cookie 并要求启动新会话来使会话过期。
关于会话如何工作的很好的描述here。
【讨论】: