在我的应用程序中,我会通过每隔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()
,每次调用控制器方法时,会话都会刷新。
谢谢
答案 0 :(得分: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
答案 1 :(得分:1)
您可以在Javascript中使用计时器来计算会话到期的时间,并使用寄存器ajaxSend处理程序来重置计时器。
答案 2 :(得分:1)
每当您向服务器发出请求时,会更新会话lastAccessedTime。
您可以做的是每次在会话中存储自定义变量的时间戳。然后使用您的ajax,您可以调用控制器的方法来检索存储在对象中的自定义时间戳。我建议你使用AOP方法来生成时间戳。我会少打扰你。
祝你好运!