2009-06-17 78 views
13

我敢肯定,你都熟悉使用AJAX的投票系統(嗯......看在那邊< ----)如何應對AJAX會話超時請求

我有事類似的,當你投票上下,它使用AJAX從votes.php中請求新的值。問題是我正在使用會話來獲取用戶ID,因此一個人只能投票一次。如果他們坐在網頁上一個小時然後投票,會議不再在那裏會發生什麼?處理這種情況的好方法是什麼?我應該將他們的頁面重定向到登錄屏幕嗎?如果是這樣,我怎麼能從AJAX請求引用的votes.php頁面上做到這一點?我忽略了處理這種情況的好方法嗎?任何意見將是有益的。

回答

11

考慮返回http狀態401和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

我給你$ 0,如果你能告訴我如何正確地返回401 – 2009-06-18 04:44:59

+0

在ASP.NET剛纔設置Response.StatusCode = 401;雖然不能告訴你如何在PHP中...也許有一天有人會建立一個網站,讓你問編程問題; -p – swilliams 2009-06-18 04:54:28

0

您構建使Ajax請求接受特殊結果(例如,-1,其中>=0數字通常會是,例如票數)意味着「對不起,你超時的Javascript代碼「並重定向到重新登錄頁面(可以將可選參數作爲向用戶解釋超時的消息,& c)。

1

您應該只在會話中存儲用戶身份的鏈接。使用會話來識別用戶爲x,然後從數據庫獲取用戶x的信息。

如果你的問題是用戶會話超時,那麼你應該重新考慮你如何使用你的會話。也許讓他們持續到瀏覽器關閉?如果你真的想讓它們持續一段時間,那麼可能會間隔地ping服務器以保持會話的活躍。

決定你的PHP腳本用戶是否應該能夠投票。如果會話沒有設置,或者他們已經投票了,則返回一個可以在客戶端識別的消息。如果他們已經投票了,可能會在一個JSON對象中返回"voted":"true"。使用JS來解析這個對象並理解它的含義,並採取適當的行動。如果未設置會話,則可能會返回"session_set":"false",然後使用JavaScript重定向window.location = "login.php"等。

只有在計數投票成功返回時才增加用戶的計數器。

0

您可以創建一個JavaScript函數,如果你想,如果他們有一個錯誤的會話連接,然後我會首先給用戶導航到登錄頁面,可以通過一些ping服務器每10分鐘就好

setTimeout("Ping()", 60000); 

驗證會話,如果失敗發送

header("Location: ..."); 

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

0

從用戶的角度來看,最好的解決辦法是彈出一條消息和登錄表單,表示類似「您未登錄或您的會話超時」。 Digg做得很好。

至於實際的AJAX實現,swilliams' 401的建議是固體。或者,您可以簡單地返回失敗時的特定字符串。

1

這是一個古老的線程,但我想和大家分享我的解決方案,工作得很好。

在我的框架,系統將用戶重定向到登錄表單,他們試圖訪問一個頁面的任何時間和會話超時或無效。 我添加到登錄的頂部形成以下HTML註釋:

<!--LOGINFORM--> 

我創建了jQuery的$就功能的包裝,檢查該字符串在每次請求,如果它的存在,它顯示一個對話框彈出窗口說他們的會話已超時。

您可以通過只調用使用:

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); 
       } 
      }, 
     }); 
    } 
};