2012-06-15 49 views
0

在我的應用程序中,我會通過每30秒執行一次Ajax調用來知道會話何時到期,但問題是當我可以使用控制器方法時,HttpSession刷新和lastaccessedtime發生更改。 那麼你有沒有想法如何知道會話的狀態而不改變它的行爲。 我使用jQuery和2.5用SpringMVC使用jquery獲取會話狀態

@RequestMapping(value = "/consultForm.htm", params = "verifySession", method = RequestMethod.GET) 
public ModelAndView verifySessionStatus(WebRequest webRequest, Model model, HttpServletRequest request, HttpServletResponse response) { 
    boolean isValid = true; 
    HttpSession session = request.getSession(false); 
    if (session.getAttribute("user") == null) { 
     isValid = false; 
    } 
    ModelAndView modelAndView = new ModelAndView("jsonView"); 
    model.addAttribute("sessionValid", isValid); 
    modelAndView.addObject(model); 
    return modelAndView; 
} 


$.ajax({ 
    url : "search.htm?verifySession=1", 
    type : "GET", 
    async : false, 
    cache : false, 
    success : function(data) { 

     valid = data.sessionValid; 
     if (!valid) { 
      showPopinExpire = true; 
      $("#dialog-session-expired").dialog("open"); 
     } 
    }, 
    error:function (xhr, ajaxOptions, thrownError){ 
     alert(xhr.status); 
     alert(thrownError); 
    } 
}); 

即使request.isRequestedSessionIdValid(),每次我打電話控制器的方法,該會議是刷新。

謝謝

回答

2

從你的榜樣,它似乎想要爲你這樣做的JSON響應:

valid = data.sessionValid; 

這不是默認dataType,所以你需要指定說:

$.ajax({ 
    url : "search.htm?verifySession=1", 
    type : "GET", 
    async : false, 
    cache : false, 
    dataType: 'json' // added this 
    // your rest of the code 
+0

問題是,在我的控制器中,當我獲得會話時,它被刷新並且lastaccessedtime已更新!你有想法保留它嗎? – Mohamed

+0

當我在我的控制器中調用會話時,lastAccessedTime改變了。當我進行Ajax調用時,有什麼方法可以保留它嗎?謝謝 – Mohamed

1

您可以在JavaScript中使用定時器計數的時間會過期,並有註冊ajaxSend處理程序復位定時器。

+0

當我在我的控制器中調用會話時,lastAccessedTime改變了。當我進行Ajax調用時,有什麼方法可以保留它嗎?謝謝 – Mohamed

+0

@Mohamed在php每次你用ajax調用你的腳本時,你的會話計時器設置被重置。例如,如果您不希望會話過期,則可以間隔調用一次jax請求。 – jcubic

1

每次您向服務器發出請求時,會話lastAccessedTime都會更新。

你可以做的是在會話中存儲一個自定義變量的時間戳。然後使用你的ajax,你可以調用控制器的方法來檢索存儲在你的對象中的自定義時間戳。我建議你使用AOP方法來生成你的時間戳。我會不那麼幹擾。

祝你好運!