如何处理 AJAX 请求中的会话超时

Posted

技术标签:

【中文标题】如何处理 AJAX 请求中的会话超时【英文标题】:How to deal with session timeouts in AJAX requests 【发布时间】:2010-11-03 13:24:58 【问题描述】:

相信大家都熟悉使用 AJAX 的投票系统(嗯……看那边

我有类似的东西,当您投票赞成或反对时,它使用 AJAX 从 votes.php 请求新值。问题是我正在使用会话来获取用户 ID,因此一个人只能投票一次。如果他们在页面上坐了一个小时然后投票所以会议不再存在会发生什么?处理这种情况的好方法是什么?我应该将他们的页面重定向到登录屏幕吗?如果是这样,我该如何从 AJAX 请求引用的 votes.php 页面执行此操作?我是否忽略了处理这种情况的好方法?任何建议都会有所帮助。

【问题讨论】:

【参考方案1】:

从用户的角度来看,最好的解决方案是弹出一条消息和登录表单,说诸如“您未登录或会话超时”之类的内容。 Digg 在这方面做得很好。

至于实际的 AJAX 实现,swilliams 的 401 建议是可靠的。或者,您可以在失败时简单地返回一个特定的字符串。

【讨论】:

【参考方案2】:

这是一个旧线程,但我想分享我的解决方案,效果非常好。

在我的框架中,只要用户尝试访问页面并且会话超时或无效,系统就会将用户重定向到登录表单。 我在登录表单的顶部添加了以下 html 注释:

<!--LOGINFORM-->

我为 jQuery 的 $.ajax 函数创建了一个包装器,它在每个请求上检查此字符串,如果存在,它会显示一个对话框弹出窗口,说明他们的会话已超时。

你可以通过调用来使用它:

ajax.get('http://someurl.com', function(data)
    //Do stuff
);

希望对某人有所帮助。

var ajax = 
    check_login : function(resp)
        if (resp.substring(0, 16) === "<!--LOGINFORM-->")
            // Show a popup or redirect them to login page!
            return true;
        
        return false;
    ,
    get : function(url, success)       
        if (typeof data =='undefined')
            data = null;
        

        $.ajax(
            url: url,
            type : 'GET',
            success : function(resp)
                if (!ajax.check_login(resp)) 
                    success(resp);
                
            ,
        );
       
;

【讨论】:

【参考方案3】:

您可以创建一个 javascript 函数,该函数可以通过类似的方式每 10 分钟 ping 一次服务器

setTimeout("Ping()", 60000); 

如果您想在用户连接错误会话时将用户导航到登录页面,那么我将首先验证会话,如果失败则发送

header("Location: ...");

http://ca2.php.net/manual/en/function.header.php

【讨论】:

【参考方案4】:

您应该只在会话中存储指向用户身份的链接。使用会话将用户标识为x,然后从数据库中获取用户x 的信息。

如果您的问题是用户会话超时,那么您应该重新考虑如何使用会话。也许让它们持续到浏览器关闭?如果你真的想让它们成为一个持续时间,那么可能会每隔一段时间对服务器进行 ping 操作以保持会话处于活动状态。

在您的 php 脚本中决定用户是否应该能够投票。如果会话未设置,或者他们已经投票,则返回一条您可以在客户端识别的消息。如果他们已经投票,则可能在 JSON 对象中返回 "voted":"true"。使用 JS 解析这个对象并理解它的含义,采取适当的行动。如果会话未设置,可能返回"session_set":"false",然后使用window.location = "login.php" 等进行javascript 重定向。

仅在计票成功返回时为用户增加计数器。

【讨论】:

仅供参考,我只是将用户 ID 存储在会话中【参考方案5】:

考虑返回 401 的 http 状态和详细说明原因的 JSON 对象。如果您使用的是 jQuery,这会将您带到 error() 回调,然后您可以解析您的对象。

$.ajax(
  data: ,
  dataType: 'html',
  success: function(data) 
    // do whatever here
  ,
  type: 'POST',
  url: 'myserver.com',
  error: function(XMLHttpRequest, textStatus, errorThrown) 
    // XMLHttpRequest.responseText has your json string
    // XMLHttpRequest.status has the 401 status code
    if (XMLHttpRequest.status === 401) 
      location.href = 'login.php';
    
  
);

我不再熟悉 PHP,但这应该适用于几乎任何环境。您可能必须禁止任何自动登录表单重定向。在 asp.net mvc 中,框架将看到 401 并将默认登录表单推回,状态为 200。

【讨论】:

如果你能告诉我如何正确返回 401,我会给你 0 美元 在 ASP.NET 中你只需设置 Response.StatusCode = 401;虽然无法告诉您如何使用 PHP...也许有一天有人会建立一个网站,让您提出编程问题;-p 我实际上已经尝试过了,它最终会弹出一个 Http 身份验证框,询问您的用户名和密码。这不是我想要的功能。 我猜可能是因为这条线,我现在正在测试没有它: header('WWW-Authenticate: Basic Realm="Login please"'); 你不必使用 401。500 也可以,虽然它不是很明确。【参考方案6】:

您构建了使 Ajax 请求接受特殊结果的 Javascript 代码(例如,-1,其中 &gt;=0 数字通常是,例如,票数)表示“对不起,小伙子,你”重新超时”并重定向到重新登录页面(它可以作为可选参数向用户解释他们超时的消息,&c)。

【讨论】:

以上是关于如何处理 AJAX 请求中的会话超时的主要内容,如果未能解决你的问题,请参考以下文章

golang channel 超时如何处理

如何处理 QTcpServer 中的 TLS 握手超时?

如何处理java中的方法超时? [复制]

ASP.NET Core MVC 502 bad gateway 超时如何处理

微服务架构中的分布式事务,如何处理超时和失败的提交

如何处理 urllib2 套接字超时?