2011-12-30 67 views
2

我已經在MVC中實現了一個項目,並且我已經用ajax請求完成了大部分工作。但我們正面臨會話超時的問題。所以我想要一些與Ajax有關的事情,在做任何Ajax請求之前檢查會話,然後處理該Ajax請求。在每個jquery Ajax命中之前檢查會話

我不想寫如果其他條件在我使用ajax的所有頁面中。

請建議一些方法。

感謝 阿圖爾我在一個項目做了

+0

您使用彈簧安全嗎? – 2011-12-30 13:03:14

+0

不是..我沒有使用彈簧安全 – 2011-12-30 13:08:56

+1

這是一個基於Java的網絡應用程序嗎? – 2011-12-30 13:12:14

回答

1

也許你應該檢查jQuery.ajaxPrefilter()(http://api.jquery.com/jQuery.ajaxPrefilter/)。你也不能修改你的應用程序池關於空閒超時的設置來完全避免會話超時?

+0

$ .ajaxPrefilter也適用於$ .get。 – 2011-12-30 13:21:51

+0

在應用程序中發生$ .ajax()調用之前是否應用$ .ajaxPrefilter() ? – 2011-12-30 13:28:57

0

一個辦法是實現它獲取的背景在一定的時間間隔發送保活Ajax請求......讓你的會話沒有得到超時......

也許不是一個很優雅的方式,但它的工作:)

+0

但是,所有會話超時點都會使如果在一段時間內沒有活動會話,對嗎? – 2011-12-30 13:07:13

+0

是的,但有些情況下您不希望會話超時(在我的項目中,它是一個小型Intranet應用程序,php會話超時無法重置),或者如果您有編輯頁面或博客頁面插入文本的時間可能需要一段時間... – Vapire 2011-12-30 13:09:31

0

我有jQuery-ajax,spring mvc和spring安全體系結構的問題。

我遵循的解決方案如下。

如果發生會話超時,spring security會將請求重定向到登錄表單控制器。

在登錄控制器中檢查請求(Saved Request)是否是ajax請求(表頭爲x-requested-with),如果它是ajax請求,則返回表示超時的json/xml值。例如:{"session-timeout" : true}

然後使用全局jQuery ajax事件(如ajaxSuccess/ajaxError)來測試此ajax返回的值,以查看是否存在會話超時並採取您想採取的任何操作。

您可以使用您正在使用的任何應用程序框架來嘗試這樣的事情。

0

您可以創建一個global filter;全局過濾器會影響每個控制器操作,可以檢查會話是否存在,然後重定向到登錄頁面或按照某種方式執行操作。此外,您可以通過創建一個視圖來保持會話的活躍,而該視圖使用AJAX或使請求保持到服務器的iframe進行ping,因此會話保持活動狀態。現在的問題是你要會活下去那麼久那麼......

1

我今天一直圍繞這個問題,這是我的解決方案:

這個PHP部分(文件或控制器的方法)將被稱爲阿賈克斯:

// create your preferred way of returning a json object like { "isLogged": true } 
echo json_encode(array('isLogged' => checkSession())); 

現在,把這個腳本中的所有頁面都具有AJAX調用和需要用戶的開始要記錄:

$(document).ajaxSend(function(e, xhr) { 
    $.ajax({ 
     url: 'checkSession.php', 
     type: 'GET', 
     global: false, 
     success: function(session) { 
      if(!session.isLogged) { 
       xhr.abort(); 

       // This allows my framework to take care of the redirect 
       // and to remember the intended page, 
       // so it redirects back here after login: 
       location.reload(); 

       // use this one to redirect directly to the login page: 
       // window.location.replace('login.php'); 
      } 
     }, 
     dataType: 'json' 
    }); 
}); 

global: false部分在這裏是必不可少的,爲了防止這個ajax調用輸入ajaxSend並因此創建一個無限循環。