0

在我的应用程序中,我会通过每 30 秒执行一次 Ajax 调用来知道会话何时过期,但问题是当我可以控制方法时,HttpSession 刷新和 lastaccessedtime 发生了变化。所以你知道如何知道会话的状态而不改变它的行为吗?我正在使用 Jquery 和 SpringMVC 2.5

@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(),每次我调用控制器方法时,会话都会刷新。

谢谢

4

3 回答 3

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
于 2012-06-15T08:27:30.930 回答
1

您可以在 Javascript 中使用计时器来计算会话到期的时间,并注册ajaxSend处理程序来重置计时器。

于 2012-06-15T08:26:13.690 回答
1

每次您向服务器发出请求时,会话 lastAccessedTime 都会更新。

您可以做的是每次您想在会话中存储一个自定义变量的时间戳。然后使用您的 ajax,您可以调用控制器的方法来检索存储在您的对象中的自定义时间戳。我建议您使用 AOP 方法来生成您的时间戳。我会少打扰。

祝你好运 !

于 2012-06-15T14:03:02.580 回答