1

在我的 Web 应用程序中,我经常可以看到,当我几分钟没有做任何事情时,然后我回来并刷新页面 - 我仍在登录,但我的会话数据全部消失了!

login()操作中,我设置了一些Session[]页面正常工作所必需的对象。我不知道为什么要这样做,但我需要它在清除用户会话数据时注销用户。

我已阅读有关设置<sessionState mode="InProc" timeout="20"/>但每次刷新页面时都会刷新此超时吗?或者它会在我登录后 20 分钟后用完?如果我让这个计时器比我保持用户在线的时间更大怎么办?

4

3 回答 3

3

回发到服务器将使会话保持更长时间。这是一个滑动到期。有两种方法可以从客户端处理,客户端不知道这个 20 分钟超时:

  • 使用客户端 javascript 创建一个计时器,该计时器在 20 分钟时重定向到注销页面
  • 每当回发发生时,检查会话是否过期(可以通过多种方式完成,例如检查 Session.IsNewSession,查看您的对象是否丢失等),然后在处理请求之前重定向到注销处理程序。
于 2013-02-01T21:01:13.237 回答
1

我假设您正在使用表单身份验证。那是对的吗?如果是这样,您需要让表单身份验证票证的超时时间与会话超时时间相匹配。

用户通过一个比最初看起来更复杂的过程保持登录状态。cookie 存储在用户的浏览器中,称为 Forms Authentication Ticket。如果用户在会话超时限制之后保持空闲状态,服务器将丢弃会话。但在下一个请求中,Forms Authentication Ticket 将被传回 Web 服务器。服务器验证票证,如果票证仍然有效,则用户重新登录。

如您所见,用户的会话没有恢复。如果您想要这种行为,则必须自己检测这种情况并恢复会话。

解决方案是将 Forms Authentication Ticket 的超时设置为与 Session 超时相同。您可以在 Web.config 文件中完成此操作,如下所述

<system.web>
    <authentication mode="Forms">
          <forms timeout="20"/>
    </authentication>
</system.web>

超时值以分钟为单位。一旦 Forms Authentication Ticket 超时,用户将被注销。这与会话的超时无关,但如果它们相同,它们将在大致相同的时间到期。如果您想完全安全,请将 Forms Authentication Ticket 超时设置为比会话超时短一点。用户将在会话超时之前注销。当他们再次登录时,他们将获得一个新会话。旧会话最终将自行超时。

于 2013-02-01T21:12:16.103 回答
0

尝试检查:

问:在 Proc 模式下,为什么我偶尔会丢失所有会话?

答:请参阅本文“了解会话状态模式”部分中的“稳健性”部分。

鲁棒性

InProc - 如果工作进程 (aspnet_wp.exe) 回收,或者应用程序域重新启动,会话状态将丢失。这是因为会话状态存储在应用程序域的内存空间中。重启可能是由于修改了某些配置文件如 web.config 和 machine.config,或 \bin 目录的任何更改(如使用 VS 重新编译应用程序后的新 DLL),详情请参阅 KB324772 . 在 v1 中,还有一个错误会导致工作进程重新启动。它已在 SP2 和 v1.1 中修复。请参阅 KB321792。

来源 - http://forums.asp.net/t/7504.aspx/1

于 2013-02-01T21:01:53.690 回答