日期:2014-05-20  浏览次数:20733 次

session监听在线人名字的问题?
我写了一个得到在线人的一个监听器。
问题出来了,那就是客户端的浏览器已经关了。但这个list_user,里并没有移去相应的对象。请问大家是什么原因?
要怎么样做才行?谢谢。

public   class   Post6OnlineList   implements   HttpSessionAttributeListener{
private   static   List   list_user=new   ArrayList();  

public   void   attributeAdded(HttpSessionBindingEvent   se)   {
//   session有增加时,加入list
if( "login_name ".equals(se.getName()))
list__user.add(se.getValue());
}

public   void   attributeRemoved(HttpSessionBindingEvent   se)   {
//   session有减少时,去list中移去
if( "login_name ".equals(se.getName()))
list_user.remove(se.getValue());
}

public   void   attributeReplaced(HttpSessionBindingEvent   se)   {
//   TODO   Auto-generated   method   stub

}
public   static   List   getList(){
return   list_user;
}
}


------解决方案--------------------
1.客户关闭浏览器一段时间后
2.客串户长时间不点页面中的链接
上述的两种情况都会导致和此用户关联的session失效,你可以用一个session监听就可以完成所说的功能了。比如下面的代码:
public class SessionListener implements HttpSessionListener {
static Logger log=Logger.getRootLogger();
public void sessionCreated(HttpSessionEvent event) {
//做一些事件
}

public void sessionDestroyed(HttpSessionEvent event) {
SysUser user=(SysUser) event.getSession().getAttribute( "user ");
if(user!=null) {
CtxUtil.getService().getUserMsgManager().delSessionUser(user);
}
}


}

相应的web.xml
<listener>
<listener-class> com.filter.CtxUtilListen </listener-class>
</listener>
<listener>
<listener-class>
com.service.listener.SessionListener
</listener-class>
</listener>
------解决方案--------------------
session.invalidate();摧毁SESSION不行吗?
------解决方案--------------------
楼主的问题我也碰到过,如果你光想用用户关闭窗口来判断是不可行的,你设想一下,如果用户用的是多窗口的浏览器,那么他如果关闭了其中一个,你是不是也要把session废掉呢?所以推荐楼主还是给session设一个过期时间把,这样用户在一段时间内没有活动的话,监听器可以自动把session置为无效
------解决方案--------------------
有价值的问题,看样子差不多解决了。。
------解决方案--------------------
public class TestListener implements HttpSessionAttributeListener,
HttpSessionListener, ServletContextListener {

ServletContext application = null;
List list= null;
public void attributeAdded(HttpSessionBindingEvent sbe) {
if( "uname ".equals(sbe.getName())){
String value = (String) sbe.getValue();
list = (List)application.getAttribute( "allUser ");
list.add(value);
}

}

public void attributeRemoved(HttpSessionBindingEvent sbe) {
if( "uname ".equals(sbe.getName())){
String value = (String) sbe.getValue();
list = (List)application.getAttribute( "allUser ");
list.remove(value);
}

}
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println( "Session销毁。。。。。。。。。。 ");

}

public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub

}

public void contextInitialized(ServletContextEvent sce) {
application = sce.getServletContext();
application.setAttribute( "allUser ", new ArrayList());