HttpSessionEvent getSession()。getId()返回相同的Id,即使在Websphere上的会话无效,而不是在Tomcat上

时间:2015-12-11 12:06:54

标签: java spring-mvc session

我有一个示例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没有改变?我错过了什么,或者这是预期的行为

1 个答案:

答案 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
}