默认情况下,会话过期时间似乎为20分钟。
更新:我不希望会话在浏览器关闭之前过期。
更新2:这是我的场景。用户登录网站。在网站上玩耍。离开电脑去淋浴(> 20分钟;)回来后,应该能够继续玩耍。他关闭浏览器,删除了会话cookie。下一次他从新的浏览器实例访问网站时,需要再次登录。
在PHP中,我可以将php.ini中的session.cookie_lifetime设置为零以实现此目的。
<configuration>
<system.web>
<sessionState timeout="60" />
... other elements omitted ...
</system.web>
... other elements omitted ....
</configuration>
你可以使用以下代码为特定用户执行相同的操作:
Session.Timeout = 60
这并不是一个新问题,如果你想捕捉所有会话结束的方式,就必须处理几种情况,以下是其中一些通用示例:
前两个必须由客户端向服务器发送信息来处理,通常您将使用JavaScript导航到一个快速过期会话的注销页面。
第三和第四个通常通过设置会话状态超时来处理(可以是任何时间)。使用的时间取决于找到允许用户在不过度使用服务器的情况下使用您的站点的值。非常粗略的经验法则可能是30分钟加减10分钟。然而,适当的值可能需要成为另一篇文章的主题。
第五个根据您存储会话的方式进行处理。存储在状态中的会话不会在重新启动后恢复,因为它们在计算机的RAM中。存储在数据库或cookie中的会话将在重新启动后恢复。您可以根据需要处理此问题。
根据我的有限经验,在此问题出现之前,已确定只需将会话超时设置为可接受的值即可。然而,这是可以解决的。
这是默认设置。当您有一个会话时,它将会把会话存储在“会话Cookie”中,该Cookie会在浏览器关闭时自动删除。
如果您想在两个浏览器会话之间保持会话,则必须将Cookie.Expired设置为未来的日期。
因为您所谈论的会话是由服务器存储的,而不是客户端,所以您无法做到您想要的。
但请考虑不使用ASP.NET服务器端会话,而仅依赖于Cookie。
很遗憾,由于网络的显式性质以及网站服务器和用户浏览器之间没有永久链接,因此无法确定用户何时关闭了浏览器。您可以实现事件和JavaScript(例如onunload),并使用它们向服务器发出调用,从而“终止”会话-Session.Abandon();
您可以在web.config中设置会话的超时长度,请记住,此超时是基于用户浏览器最后一次调用服务器的时间。
浏览器超时未添加。
如果在窗口关闭时客户端与服务器之间没有任何通信,那么就没有明确清除会话的方法。因此,我建议在接收到窗口关闭消息时发送特殊的URI请求以清除会话。
我的JavaScript水平不够好,无法给出具体操作指导,非常抱歉 :(
你无法这样做,因为你无法控制html客户端的响应。
实际上,为什么你需要这样做呢?只要没有人可以重复使用session,它将在20分钟后过期。如果资源很重要,请设置更积极的会话过期时间(大多数托管公司都这样做,这非常烦人),或者在会话中使用较少的对象。尽量避免任何类型的对象,而是只存储用于检索它们的键,这是一个非常重要的设计,因为它可以帮助你将会话扩展到状态服务器,当你变得庞大时。
如果我对你的问题意图有误解,请纠正我,但是这个问题的真正关注点似乎不在于如何在用户关闭浏览器时强制结束会话,而更多地关乎如何防止会话在浏览器关闭之前结束。
我认为对此问题的真正答案是重新评估你使用会话的目的。如果你使用会话来维护状态,我同意其他回答中的说法,你可能会没有办法实现。
然而,一种更好的做法是使用一个与浏览器会话相同范围的持久状态机制,比如在浏览器关闭时过期的cookie。该cookie可以包含足够的信息,以便在上次请求之后会话已过期时重新启动服务器上的会话。结合相对较短的(5-10分钟)会话超时时间,我认为这可以在服务器资源使用和不让用户不断“重新启动”网站之间取得最佳平衡。
哦,你已经重写了问题。
只要JavaScript还活着,那个绝对是可行的。使用任何定时Ajax都可以。使用Prototype库http://www.prototypejs.org的PeriodicalExecutor或带有ajax + timer插件的jQuery。设置一个虚拟页面,您的执行器将定期调用该页面,因此除非他注销(同时停止Ajax计时器)或关闭浏览器(这意味着执行器无论如何都会被杀死),否则您的会话始终处于活动状态。