6

默认情况下,会话到期时间似乎是 20 分钟。

更新:我不希望会话在浏览器关闭之前过期。

Update2:这是我的场景。用户登录网站。在现场播放。离开电脑去洗澡(>20 分钟;))。回到电脑前,应该可以玩了。他关闭浏览器,这会删除会话 cookie。下次他从新的浏览器实例访问该站点时,他需要再次登录。

在 PHP 中,我可以将 php.ini 中的 session.cookie_lifetime 设置为零来实现这一点。

4

9 回答 9

6

如果您想将会话延长到 20 分钟以上,您可以使用 IIS 管理员更改默认设置,或者您可以在 web.config 文件中进行设置。例如,在 web.config 中将超时设置为 60 分钟:

<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

您可以使用以下代码对特定用户执行相同操作:

Session.Timeout = 60

无论您选择哪种方法,您都可以将超时更改为您认为合理的任何值,以允许您的用户做其他事情并仍然保持他们的会话。

当然也有缺点:对于用户来说,可能存在让他们的浏览器无人看管并且在其他人开始使用它时仍然登录的安全问题。对您来说,服务器上的内存使用问题 - 会话持续时间越长,您将在任何时候使用的内存越多。这是否重要取决于服务器上的负载。

如果您不想猜测合理的延长超时时间,则需要使用已经建议的其他技术之一,需要在浏览器中运行一些 JavaScript 定期 ping 服务器和/或在页面卸载时放弃会话(当然,前提是用户不会访问您网站上的其他页面)。

于 2008-09-18T16:48:29.643 回答
3

您可以设置一个较短的会话超时(例如 5 分钟),然后让页面定期轮询服务器,方法是使用 Javascript 每 2 分钟触发一次 XmlHttpRequest,或者使用隐藏的 iframe 指向一个页面,该页面每2分钟。

一旦浏览器关闭,会话很快就会超时,因为没有什么可以让它保持活动状态。

于 2008-09-18T16:10:57.080 回答
3

这不是一个新问题,如果您想捕获会话可以结束的所有方式,则必须处理几种情况,以下是其中一些的一般示例:

  1. 浏览器实例或选项卡已关闭。
  2. 用户使用相同的浏览器实例或选项卡离开您的网站。
  3. 用户失去与互联网的连接(这可能包括用户计算机断电或任何其他方式)。
  4. 用户离开计算机(或以其他方式停止与您的站点交互)。
  5. 服务器断电/重新启动。

前两项必须由客户端向服务器发送信息来处理,通常您会使用 javascript 导航到快速使会话过期的注销页面。

第三项和第四项通常通过设置会话状态超时(可以是任意时间)来处理。您使用的时间量取决于找到一个允许用户使用您的站点而不会压倒服务器的值。一个非常粗略的经验法则可能是 30 分钟正负 10 分钟。但是,适当的值可能必须是另一篇文章的主题。

第五个项目是根据您存储会话的方式来处理的。以状态存储的会话将无法在重新启动后继续存在,因为它们位于计算机的内存中。存储在 db 或 cookie 中的会话将在重新启动后继续存在。你可以按照你认为合适的方式处理它。

根据我之前出现此问题的有限经验,已确定只需将会话超时设置为可接受的值即可。然而它是可以做到的。

于 2008-09-18T16:16:34.383 回答
1

这是默认设置。当您有会话时,它会将会话存储在“会话 Cookie”中,当浏览器关闭时会自动删除该会话。

如果您想在 2 个浏览器会话之间进行会话,则必须将 Cookie.Expired 设置为功能中的日期。

因为您谈论的会话是由服务器存储的,而不是由客户端存储的,所以您无法为所欲为。

但考虑不使用 ASP.NET 服务器端会话,而只依赖 cookie。

于 2008-09-18T16:01:22.517 回答
1

不幸的是,由于网络的明确性质以及网站服务器和用户浏览器之间没有永久链接的事实,无法判断用户何时关闭了浏览器。您可以实现一些事件和 JavaScript(例如 onunload),您可以使用这些事件和 JavaScript 将调用返回到服务器,这反过来又可以“杀死”一个会话 -Session.Abandon();

您可以在 web.config 中设置会话的超时长度,记住此超时基于用户浏览器上次调用服务器后的时间。

未添加浏览器超时。

于 2008-09-18T16:07:20.273 回答
0

如果您在窗口关闭时不以某种方式在客户端和服务器之间进行通信,则无法明确清除会话,因此我希望在接收窗口时发送一个特殊的 URI 请求来清除会话关闭消息。

我的 Javascript 不足以为您提供执行此操作的实际说明;对不起 :(

于 2008-09-18T16:04:01.870 回答
0

您不能,因为您无法控制 html 客户端的响应方式。

实际上为什么你需要这样做?只要没有人可以拿起会话再次使用,它就会在 20 分钟后过期。如果资源确实很重要,请设置更积极的会话到期时间(大多数托管公司都这样做,这非常烦人)或在会话中使用更少的对象。尽量避免使用任何类型的对象,而只存储用于检索它们的密钥,这是一个非常重要的设计,因为它可以帮助您在变大时将会话扩展到状态服务器。

于 2008-09-18T16:05:57.187 回答
0

如果我误读了您的问题的意图,请纠正我,但基本问题似乎不是关于如何在用户关闭浏览器时强制会话结束,而是更多关于如何防止会话在浏览器关闭之前结束。

我认为这个问题的真正答案是重新评估你正在使用会话做什么。如果您使用它们来维护状态,我同意您可能不走运的其他回答。

但是,首选方法是使用与浏览器会话具有相同范围的持久状态机制,例如在浏览器关闭时过期的 cookie。如果该 cookie 自上次请求以来已过期,则该 cookie 可能包含足够的信息来重新启动服务器上的会话。结合相对较短(5-10 分钟)的会话超时,我认为这可以让您在服务器资源使用和不让用户不断“重新启动”站点之间取得最佳平衡。

于 2008-09-18T16:44:15.380 回答
0

哦,你已经重写了这个问题。

只要javascript还活着,那是绝对可行的。使用任何定时 ajax 都可以。使用 ajax + timer 插件检查原型库http://www.prototypejs.org PeriodicalExecutor 或 jQuery。设置一个虚拟页面,您的执行程序会不时调用该页面,因此您的会话始终处于活动状态,除非他注销(同时杀死 ajax 计时器)或关闭浏览器(这意味着执行程序无论如何都会被杀死)

于 2008-09-19T09:33:22.270 回答