我相信你们都熟悉使用AJAX的投票系统(嗯......看那边< ----)
我有类似的东西,当你向上或向下投票时,它使用AJAX从votes.php请求新值。问题是我正在使用会话获取用户ID,因此一个人只能投票一次。如果他们在页面上坐了一个小时然后投票,那么会话不再存在会发生什么?处理这种情况的好方法是什么?我应该将他们的页面重定向到登录屏幕吗?如果是这样,我怎么能从AJAX请求引用的votes.php页面中做到这一点?我是否忽略了处理这种情况的好方法?任何建议都会有所帮助。
答案 0 :(得分:11)
考虑返回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.
答案 1 :(得分:1)
您应该只在会话中存储指向用户身份的链接。使用会话将用户标识为 x ,然后从数据库中获取用户 x 的信息。
如果问题在于用户会话超时,那么您应该重新考虑如何使用会话。也许让它们持续到浏览器关闭为止?如果你真的想让它们成为一个持续时间,那么可能会间隔地ping服务器以保持会话的活跃性。
确定您的php脚本是否应该能够投票。如果未设置会话,或者他们已经投票,则返回您可以在客户端识别的消息。如果他们已经投票,可能会在JSON对象中返回"voted":"true"
。使用JS解析此对象并理解其含义,采取适当的操作。如果未设置会话,可能会返回"session_set":"false"
,然后使用window.location = "login.php"
等进行javascript重定向。
仅在成功返回计票时为用户增加计数器。
答案 2 :(得分:1)
这是一个老线程,但我想分享我的解决方案,该方法非常有效。
在我的框架中,系统会在用户尝试访问页面时将用户重定向到登录表单,并且会话已超时或无效。 我在登录表单的顶部添加了以下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 :(得分:0)
您构建了使Ajax请求接受特殊结果的Javascript代码(例如-1
,其中>=0
数字通常是,例如,投票数)表示“抱歉” bub,你已经超时“并重定向到重新登录页面(可以作为一个可选参数,向用户说明他们超时的消息,&amp; c)。
答案 4 :(得分:0)
您可以创建一个javascript函数,可以通过
之类的内容每10分钟ping一次服务器setTimeout("Ping()", 60000);
如果您希望将用户导航到登录页面,如果他们连接有故障的会话,那么我将首先验证会话,如果失败则发送
header("Location: ...");
答案 5 :(得分:0)
从用户的角度来看,最好的解决方案是弹出一条消息和登录表单,说“你没有登录或你的会话超时”。 Digg做得非常好。
至于实际的AJAX实现,swilliams的401建议是可靠的。或者,您可以在失败时返回特定字符串。