参(照)考(抄)的代码
在运行HttpSessionListener的样例代码时,一切良好,如预期那样,打开一个会话新建了一个session,然后阔以登录n个账号。
阔是到了使用HttpSesionBindingLister例子时,便出现了问题
发现用户不是增添的,而是直接被替代了?俺看着添加逻辑都是一样的
List onlineUserList = (List)application.getAttribute("onlineUserList");
if(onlineUserList==null){
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList",onlineUserList);
}
onlineUserList.add(this.username);
那就不是代码逻辑的问题。
接着俺想到会不会是session的问题由于使用同一个session,更新绑定值时便会删除之前存的值。
session.setAttribute("onlineUserBindingListener",
new OnlineUserBindingListener(userName));
使用俩浏览器看看。发现没问题了。
打印了同一个浏览器多网页的session值,发现果然是一样的。
然后再将OnlineUserBindingListener类中的valueUnbound方法的删除当前用户的代码注释掉并加入到logout.jsp中,发现结果与上例中一致了。
结论:
经过以上实验发现,由于同于在session中更新的Attribute,导致执行了解绑操作,所以一个浏览器便不可以同时登录多个账号。不过这一点正好也正是大多数正常应用场景所需要的。
(下面这篇谈三者之间区别的文章,俺感觉写得挺不错的。)
浅谈:request,session,application