JSP 作为后起之秀能够在服务器编程环境中占据一定地位,是和它良好支持一
系列业界标准密切相关的。Session 就是它提供的基础设施之一。作为一个程
序员,你可以不介意具体在客户端是如何实现,就方便的实现简单的基于
session 的用户管理。现在对于处理在线用户,有几种不同的处理方法。
一种是页面刷新由用户控制,服务器端控制一个超时时间比如 30 分钟,
到了时间之后用户没有动作就被踢出。这种方法的优点是,如果用户忘了退出,
可以防止 别人恶意操作。缺点是,如果你在做一件很耗时间的事情,超过了这
个时间限制,submit 的时候可能要再次面临登陆。如果原来的叶面又是强制
失效的话,就 有可能丢失你做的工作。在实现的角度来看,这是最简单的,
Server 端默认实现的就是这样的模式。
另一种方式是,站点采用框架结 构,有一个 Frame 或者隐藏的 iframe 在
不断刷新,这样你永远不会被踢出,但是服务器端为了判断你是否在线,需要
定一个发呆时间,如果超过这个发呆 时间你除了这个自动刷新的页面外没有刷
新其他页面的话,就认为你已经不在线了。采取这种方式的典型是 xici.net。
他的优点是可以可以利用不断的刷新实现一些类似 server-push 的功能,比如
网友之间发送消息。
不管哪一种模式,为了实现浏览当前所有的在线用户,还需要做一些额外
的工作。servlet API 中没有得到 Session 列表的 API。
可以利用的是 Listener. Servlet 2.2 和 2.3 规范在这里略微有一些不一
样。2.2 中 HttpSessionBindingListener 可以实现当一个 HTTPSession 中
的 Attribute 变化的时候通知你的类。而 2.3 中还引入了
HttpSessionAttributeListener.鉴于我使用的环境是 Visual age for java 4
和 JRun server 3.1,他们还不直接支持 Servlet 2.3 的编程,这里我用的是
HttpSessionBindingListener.
需要做的事情包括做一个新的类来实现 HttpSessionBindingListener 接
口。这个接口有两个方法:
public void valueBound(HttpSessionBindingEvent event)
public void valueUnbound(HttpSessionBindingEvent event)
当你执行 Session.addAttribute(String,Object)的时候,如果你已经把
一 个实现了 HttpSessionBindingListener 接口的类加入为
Attribute,Session 会通知你的类,调用你的 valueBound 方法。相反,
Session.removeAttribute 方法对应的是 valueUndound 方法。
public class HttpSessionBinding implements
javax.servlet.http.HttpSessionBindingListener
{