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

时间:2020-03-06 14:22:06  来源:igfitidea点击:

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

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

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

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

解决方案

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

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

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

但是请考虑不要使用ASP.NET服务器端会话,而应仅依靠Cookie。

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

我的Java语言还不够好,无法为我们提供执行该操作的实际说明;对不起 :(

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

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

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

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

浏览器超时未添加。

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

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

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

  • 浏览器实例或者选项卡已关闭。
  • 用户使用相同的浏览器实例或者选项卡浏览网站。
  • 用户失去与互联网的连接(这可能包括用户计算机的电源中断或者任何其他方式)。
  • 用户离开计算机(或者以其他方式停止与站点进行交互)。
  • 服务器断电/重启。

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

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

第五项是根据我们如何存储会话来处理的。由于状态为会话状态的会话位于计算机的内存中,因此无法重新启动。存储在数据库或者cookie中的会话将在重新启动后幸免。我们可以按自己认为合适的方式进行处理。

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

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

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

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

如果要将会话延长到20分钟以上,则可以使用IIS admin更改默认设置,也可以在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服务器和/或者在卸载页面时放弃会话(当然,前提是用户不会转到我们网站上的其他页面)。

哦,我们已经重写了问题。

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