【发布时间】:2016-03-17 08:18:07
【问题描述】:
我有一个带有 SessionListener 的示例 Spring MVC 应用程序:
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 时。它成功地使会话无效,我得到了让我摸不着头脑的日志。
我得到的日志sn-p是:-
会话被破坏: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 没有改变?是我遗漏了什么还是这是预期的行为?
【问题讨论】:
-
可能是因为 HTTPSession 是一个接口,所以实际的实现取决于 Server,它有单独的实现(确定)?我正在为这个示例代码使用 websphere。
-
我已经在 Tomcat 上进行了验证,它正在返回更改后的 ID。
标签: java spring-mvc session