我有一个示例Spring MVC应用程序,其SessionListener为:
public class SessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent e) {
logger.info("Session created: " + e.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent e) {
logger.info("Session destroyed: " + e.getSession().getId());
}
}
和自定义控制器: -
@Controller
public class SessionInvalidateController {
@RequestMapping("/invalidateSession")
void clearSession(HttpSession session) {
session.invalidate();
}
}
Log4j.xml文件的转换模式用于记录会话侦听器事件: -
当我从应用程序中点击/ invalidateSession URL时。它成功地使会话无效,我得到的日志让我摸不着头脑。
我得到的日志片段是: -
会话销毁:4c3kpUbJt1zvCeOHWJkxpJY
创建的会话: 4c3kpUbJt1zvCeOHWJkxpJY
我检查了从HTTPSession返回id的HttpSessionEvent代码。代码链接:http://grepcode.com/file/repo1.maven.org/maven2/javax.servlet/servlet-api/2.4/javax/servlet/http/HttpSession.java#HttpSession.getId%28%29。
然后我在Tomcat 7上运行了相同的代码,我收到了更改后的ID。
Session destroyed: 4C7B0754969FE4EA98E351522C38E79F
Session created: 3BBA7D0968A49446D68E5505B9ECF124
虽然文件明确说明:
分配给此会话的唯一标识符
这里出现的问题是为什么这个ID没有改变?我错过了什么,或者这是预期的行为?
答案 0 :(得分:0)
请注意,如果有任何对会话的引用,它将不会失效,因此您将获得该值。这包括logger.info("Session destroyed: " + e.getSession().getId());
在session.invalidate();
之后实际检查会话是否为空HttpSession session= request.getSession(false);
if (session!= null && session.getAttribute("loginToken") != null){
//do something
}