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