如何明确设置ASP.NET会话仅在关闭浏览器或显式注销时过期?

6

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

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

更新2:这是我的场景。用户登录网站。在网站上玩耍。离开电脑去淋浴(> 20分钟;)回来后,应该能够继续玩耍。他关闭浏览器,删除了会话cookie。下一次他从新的浏览器实例访问网站时,需要再次登录。

在PHP中,我可以将php.ini中的session.cookie_lifetime设置为零以实现此目的。

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信号和/或在页面卸载时放弃会话(当然,前提是用户不会转到您网站上的另一页)。

3
你可以设置一个短的会话超时时间(例如5分钟),然后让页面定期轮询服务器,可以使用JavaScript每2分钟触发一次XmlHttpRequest,也可以使用指向每2分钟刷新自身的页面的隐藏iframe。一旦浏览器关闭,会话很快就会超时,因为没有任何东西可以保持它的活动状态。

3

这并不是一个新问题,如果你想捕捉所有会话结束的方式,就必须处理几种情况,以下是其中一些通用示例:

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

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

第三和第四个通常通过设置会话状态超时来处理(可以是任何时间)。使用的时间取决于找到允许用户在不过度使用服务器的情况下使用您的站点的值。非常粗略的经验法则可能是30分钟加减10分钟。然而,适当的值可能需要成为另一篇文章的主题。

第五个根据您存储会话的方式进行处理。存储在状态中的会话不会在重新启动后恢复,因为它们在计算机的RAM中。存储在数据库或cookie中的会话将在重新启动后恢复。您可以根据需要处理此问题。

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


1

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

如果您想在两个浏览器会话之间保持会话,则必须将Cookie.Expired设置为未来的日期。

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

但请考虑不使用ASP.NET服务器端会话,而仅依赖于Cookie。


1

很遗憾,由于网络的显式性质以及网站服务器和用户浏览器之间没有永久链接,因此无法确定用户何时关闭了浏览器。您可以实现事件和JavaScript(例如onunload),并使用它们向服务器发出调用,从而“终止”会话-Session.Abandon();

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

浏览器超时未添加。


0

如果在窗口关闭时客户端与服务器之间没有任何通信,那么就没有明确清除会话的方法。因此,我建议在接收到窗口关闭消息时发送特殊的URI请求以清除会话。

我的JavaScript水平不够好,无法给出具体操作指导,非常抱歉 :(


0

你无法这样做,因为你无法控制html客户端的响应。

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


0

如果我对你的问题意图有误解,请纠正我,但是这个问题的真正关注点似乎不在于如何在用户关闭浏览器时强制结束会话,而更多地关乎如何防止会话在浏览器关闭之前结束。

我认为对此问题的真正答案是重新评估你使用会话的目的。如果你使用会话来维护状态,我同意其他回答中的说法,你可能会没有办法实现。

然而,一种更好的做法是使用一个与浏览器会话相同范围的持久状态机制,比如在浏览器关闭时过期的cookie。该cookie可以包含足够的信息,以便在上次请求之后会话已过期时重新启动服务器上的会话。结合相对较短的(5-10分钟)会话超时时间,我认为这可以在服务器资源使用和不让用户不断“重新启动”网站之间取得最佳平衡。


0

哦,你已经重写了问题。

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


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