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

我相信你们都熟悉使用AJAX的投票系统(嗯……看那边<—-)

我有类似的东西,当你向上或向下投票时,它使用AJAX从votes.php请求新值。 问题是我正在使用会话来获取用户ID,因此一个人只能投票一次。 如果他们在页面上坐了一个小时然后投票那么会话不再存在会发生什么? 处理这种情况的好方法是什么? 我应该将他们的页面重定向到登录屏幕吗? 如果是这样,我怎么能从AJAX请求引用的votes.php页面中做到这一点? 我是否忽略了处理这种情况的好方法? 任何意见将是有益的。

考虑返回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。

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

如果您的问题是用户会话超时,那么您应该重新考虑如何使用会话。 也许让它们持续到浏览器关闭? 如果你真的想让它们成为一个持续时间,那么可能会间隔地ping服务器以保持会话的活跃性。

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

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

这是一个老线程,但我想分享我的解决方案,该方法非常有效。

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

  

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

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

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

希望它可以帮到某人。

 var ajax = { check_login : function(resp){ if (resp.substring(0, 16) === ""){ // 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); } }, }); } }; 

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

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

 setTimeout("Ping()", 60000); 

如果您想要将用户导航到登录页面,如果他们连接有错误的会话,那么我将首先validation会话,如果失败则发送

 header("Location: ..."); 

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

从用户的角度来看,最好的解决方案是弹出一条消息和登录表单,说“你没有登录或你的会话超时”。 Digg做得非常好。

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