要求如下:当用户会话过期时,请调用expired.htm页面,但在第一次连接到网站时,请显示login.htm。
我尝试使用过滤器,但它不起作用,我无法告诉过滤器如何理解它是新请求还是旧请求已过期。这是我使用的代码:
if (session.getAttribute("userProfile") == null) {
logger.debug("Session: " + ( session.isNew() ? "true" : "false"));
logger.debug(request.getSession().isNew());
if ( request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid() ) {
return new ModelAndView("redirect:expired.htm");
} else {
return new ModelAndView("redirect:login.htm");
}
}
我在Stack Overflow和一般互联网上尝试了不同的解决方案,但没有任何工作,每个请求都转到expired.htm
。
答案 0 :(得分:0)
你如何获得会话对象?在此之前,请使用
if (request.getSession(false)==null) {
// no session present (expired or new visitor)
[... do something ...]
} else {
// active session present
}
答案 1 :(得分:0)
在使用会话中的任何属性之前,您需要使用上面的验证。因为如果会话不存在,则无法获取它的属性。 你需要把假药放在肠胃外。
if(request.getSession(false) == null) { //Session don't exists
...
}
Java解释:
public HttpSession getSession(boolean create)
返回与此请求关联的当前HttpSession,如果没有当前会话且create为true,则返回新会话。
如果create为false且请求没有有效的HttpSession,则此方法返回null。
要确保正确维护会话,必须在提交响应之前调用此方法。如果容器使用cookie来维护会话完整性,并且在响应提交时要求创建新会话,则抛出IllegalStateException。
参数:
create - 如果需要,为true以为此请求创建新会话;如果没有当前会话,则返回false
返回:
与此请求关联的HttpSession,如果create为false且请求没有有效会话,则返回null