【问题标题】:session timeout weirdness会话超时怪异
【发布时间】:2011-06-22 08:23:40
【问题描述】:

我有一个人们登录的主站点。这是 IIS,标准会话时间为 20 分钟。

有一个实时聊天工具出现在同一域的弹出窗口中。不涉及 https。

尽管聊天窗口每隔几秒就会对服务器进行一次 Ajax 调用(并且总是至少返回一条数据),但每当登录用户发布消息时,它也会通过 Ajax 向服务器发送数据20 分钟后超时,好像什么都没发生一样。

任何想法为什么会发生这种情况以及如何阻止它,因为在与服务器进行积极通信的同时退出站点显然是不合理的。

【问题讨论】:

  • 您使用什么机制来验证和保持用户登录?
  • AJAX 有在浏览器上缓存的讨厌习惯.....尝试通过在每个请求上发送唯一的随机值来破坏它,看看它是否有帮助。

标签: ajax iis session asp-classic session-timeout


【解决方案1】:

听起来您正在使用表单身份验证,并且身份验证 cookie 也即将过期。

每次向应用程序发送请求并且当前会话仍然有效时,会话超时将被更新。

表单身份验证可以通过两种方式工作。您可以让用户在固定的时间内保持登录状态或使用滑动到期。例如:

<authentication mode="Forms">
    <forms defaultUrl="~/Default.aspx"
        loginUrl="~/Login.aspx"
        slidingExpiration="true"
        timeout="15" />
</authentication>

上面将表单身份验证超时设置为 15 分钟,但也启用了滑动到期 (slidingExpiration="true"。如果用户在 15 分钟内重新访问该站点,则 cookie 生命周期将延长并且用户将保持身份验证。

如果slidingExpiration="false" 则用户将在 15 分钟后被踢出,无论他们上次访问该站点是什么时候。

让表单身份验证 cookie 的过期时间稍早于 会话超时。这意味着用户在遇到空 Session 数据之前会被踢掉,如果情况相反的话。

【讨论】:

  • 这段代码去哪儿了?聊天页面不使用任何表单提交,而是使用 Ajax 抓取表单字段数据并发布。此外,它是由 ajax 调用的 ASP 脚本,它检查会话是否已过期,如果会话已过期,它会发送回数据,该数据会弹出一个警报,告诉用户他们已被注销。 Ajax 使用的实际 ASP 脚本不需要用户登录,因此它永远不会产生错误。
  • @derek - 抱歉,我以为您使用的是 ASP.NET。
  • @derek - 所以绝对是经典的 ASP 而不是 ASP.NET?
【解决方案2】:

我决定使用 cookie 而不是网站的会话变量来检查他们是否已登录。由于这是一个聊天应用程序,他们在第一次打开聊天页面时会有一个小时的时间。
每次他们发布消息时,它都会重置为一个小时后。

这样发布者保持登录状态,潜伏者就会被击退。

加载中:

response.cookies("chatuser")=nickname
response.cookies("chatuser").expires=now()+0.5

在发布消息时:

response.cookies("chatuser").expires=now()+0.5

【讨论】:

    【解决方案3】:

    您是否真的在 AJAX 请求中发送任何 cookie 信息?

    如果 AJAX 请求不包含 ASP 放置在 cookie 中的会话 ID,那么无论请求的频率如何,这些请求都不会保持会话。

    【讨论】:

    • 我不确定 - 这取决于您用于执行 AJAX 请求的代码以及您对 HTTP 请求的控制程度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2010-12-25
    • 2015-10-10
    相关资源
    最近更新 更多