我正在尝试使用HttpSessionListener:
public class SessionListener implements HttpSessionListener
{
public void sessionCreated(HttpSessionEvent event) {
System.out.println("ID Session Created: " + event.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("ID Session Destroyed: " + event.getSession().getId());
}
}
web.xml:
<listener>
<listener-class>session.SessionListener</listener-class>
</listener>
UserManager.java:
@SessionScoped
@ManagedBean(name="userManager")
public class UserManager extends Tools
{
/**/
private static final long serialVersionUID = -8522314095497978567L;
private String username;
private String password;
private transient HttpSession session = null;
public String login()
{
user = (User) find(username, password);
if (user != null)
{
username = password = null;
FacesContext context = FacesContext.getCurrentInstance();
session = (HttpSession) context.getExternalContext().getSession(true);
session.setAttribute("id", user.getID());
}
}
public void logout()
{
user = null;
FacesContext context = FacesContext.getCurrentInstance();
session = (HttpSession) context.getExternalContext().getSession(true);
session.invalidate();
}
// getters and setters ----------------------------------------------------
}
它起作用,但有点奇怪。
如果我注销,它会向控制台报告:
ID Session Destroyed: 807DEDB88D35C0351BF2B9FBA83519AB
ID Session Created: 8A029C95E6BA9DF17FB91C7F3AC81B24
如果登录,控制台中什么都没有。
我做错了什么?
会话是在浏览器向Web服务器发出请求时创建的,而不是在您"登录"时创建的。与服务器交互的每个客户端都将始终存在一个会话。无论你是否在该会话中存储任何内容或以其他方式使用它,这都无关紧要
当您注销时,您会强制服务器放弃当前会话,但由于它仍然需要与客户端通信,因此会创建一个新的("清理")会话。当你登录时,这个新会话可能仍然有效。
我相信,如果你关闭服务器并删除其所有工作缓存,你会在浏览器第一次点击时看到会话创建的消息。
session = (HttpSession) context.getExternalContext().getSession(true);
登出方法中的上面一行应该有不为true的"getSession()"。
getSession(布尔值)
返回当前HttpSession与此请求关联,或者,如果没有当前会话并创建为true,则返回一个新会话。