如何将asp.net会话显式设置为仅在关闭浏览器或显式登录时到期?

如何将asp.net会话显式设置为仅在关闭浏览器或显式登录时到期?

How do I explicitly set asp.net sessions to ONLY expire on closing the browser or explicit logou?

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

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

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

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


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

1
2
3
4
5
6
7
<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

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

1
Session.Timeout = 60

无论选择哪种方法,都可以将超时更改为您认为合理的任何值,以允许用户执行其他操作并仍保持其会话状态。

当然也有缺点:对于用户而言,可能存在安全问题,即在其他人开始使用浏览器时不理会他们的浏览器并使它仍然登录。对于您而言,服务器上存在内存使用问题-会话持续时间越长,一次使用的内存就越多。是否重要取决于服务器上的负载。

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


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

  • 浏览器实例或选项卡已关闭。
  • 用户使用相同的浏览器实例或标签浏览您的网站。
  • 用户将失去与Internet的连接(这可能包括用户计算机的电源中断或任何其他方式)。
  • 用户离开计算机(或以其他方式停止与您的站点进行交互)。
  • 服务器断电/重启。
  • 前两个项目必须由客户端将信息发送到服务器来处理,通常,您将使用javascript导航到注销页面,该页面将使会话快速过期。

    通常通过设置会话状态超时(可以是任意时间)来处理第三和第四项。您使用的时间长短基于找到一个值,该值使用户可以使用您的站点而不会使服务器不堪重负。粗略的经验法则可能是30分钟加上或减去10分钟。但是,适当的值可能必须是另一篇文章的主题。

    第五项根据您存储会话的方式进行处理。由于状态为会话状态的会话位于计算机的内存中,因此无法重新启动。存储在数据库或cookie中的会话将在重新启动后幸免。您可以按照自己的意愿进行处理。

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


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

    浏览器关闭后,会话将很快超时,因为没有任何内容可以使它保持活动状态。


    不幸的是,由于Web的明确性质以及网站服务器和用户浏览器之间没有永久链接的事实,因此无法确定用户何时关闭了浏览器。您可以实现一些事件和JavaScript(例如onunload),可以使用这些事件和JavaScript向服务器发出调用,这些调用又可能会"杀死"会话-Session.Abandon();

    您可以在web.config中设置会话的超时时间,请记住,此超时基于自用户上次对服务器的调用以来的时间。

    浏览器超时未添加。


    这是默认设置。进行会话时,它将会话存储在" Session Cookie "中,当关闭浏览器时,该会话Cookie会自动删除。

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

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

    但是请考虑不要使用ASP.NET服务器端会话,而只能依靠cookie。


    哦,您已经重写了问题。

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


    如果我误解了您的问题的意图,请纠正我,但是潜在的问题似乎与如何在用户关闭浏览器时强制会话结束无关,而更多地与如何防止会话直到浏览器结束有关已关闭。

    我认为对此的真正答案是重新评估您正在使用会话执行的操作。如果您使用它们来维持状态,则我同意您可能不走运的其他答复。

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


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

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


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

    我的Javascript不够好,无法为您提供执行该操作的实际说明;抱歉:(


    推荐阅读