Listener类:

public class UserOnLineListener implements HttpSessionAttributeListener {
 
 /** 
     * 定义监听的session属性名. 
     */ 
    public final static String LISTENER_NAME = "_loginSession"; 
   
    /** 
     * 定义存储客户登录session的集合. 
     */ 
    @SuppressWarnings("unchecked")
 private static List sessions = new ArrayList();  
    /** 
     * 加入session时的监听方法. 
     *  
     * @param HttpSessionBindingEvent 
     *            session事件 
     */ 
 @SuppressWarnings("unchecked")
 @Override
 public void attributeAdded(HttpSessionBindingEvent se) {
  
  //System.out.println("被添加的名字是:"+se.getName());
  //System.out.println("被添加的值是:"+se.getValue());
 if (LISTENER_NAME.equals(se.getName())) {  
            sessions.add(se.getValue());  
        }  
  
 }
 /** 
     * session失效时的监听方法. 
     *  
     * @param HttpSessionBindingEvent 
     *            session事件 
     */ 
 @Override
 public void attributeRemoved(HttpSessionBindingEvent se) {
  //System.out.println("被销毁的名字是:"+se.getName());
  //System.out.println("被销毁的值是:"+se.getValue());
  if (LISTENER_NAME.equals(se.getName())) {  
            sessions.remove(se.getValue());  
        }  
 }
  /** 
     * session覆盖时的监听方法. 
     *  
     * @param HttpSessionBindingEvent 
     *            session事件 
     */ 
 @Override
 public void attributeReplaced(HttpSessionBindingEvent se) {
 }
 /** 
     * 返回客户登录session的集合. 
     *  
     * @return 
     */ 
    @SuppressWarnings("unchecked")
 public static List getSessions() {  
        return sessions;  
    }  

}
 
java实体类:封装登录用户的信息
public final class OnLineSession implements Serializable {
 private static final long serialVersionUID = 1L;
 /** 
     * 客户计算机的ip. 
     */ 
    private String ip = null;  
   
    /**
     * 登录用户ID
     */
    private String keyId=null;
    /** 
     * 客户登录名.   客服工号
     */  
  private String loginId = null;  
    /** 
     * 客户登录系统时间. 
     */ 
    private String onlineTime = null;  
      
    /** 
     * 构造器. 
     * @param ip 
     * @param loginId 
     * @param onlineTime 
     */ 
    public OnLineSession(String ip,String keyId,String loginId,String onlineTime){  
        this.ip=ip;  
        this.keyId=keyId;
        this.loginId=loginId;  
        this.onlineTime=onlineTime;  
    }  
      
    /** 
     * @return Returns the ip. 
     */ 
    public String getIp() {  
        return ip;  
    }  
    /** 
     * @param ip The ip to set. 
     */  
public void setIp(String ip) {  
        this.ip = ip;  
    }  
    /** 
     * @return Returns the loginId. 
     */ 
    public String getLoginId() {  
        return loginId;  
    }  
    /** 
     * @param loginId The loginId to set. 
     */ 
    public void setLoginId(String loginId) {  
        this.loginId = loginId;  
    }  
    /** 
     * @return Returns the onlineTime. 
     */ 
    public String getOnlineTime() {  
        return onlineTime;  
    }  
    /** 
     * @param onlineTime The onlineTime to set. 
     */ 
    public void setOnlineTime(String onlineTime) {  
        this.onlineTime = onlineTime;  
    }
public String getKeyId() {
  return keyId;
 }
 public void setKeyId(String keyId) {
  this.keyId = keyId;
 }  
 
}
 
web.xml配置Listener
     <listener>
    <listener-class>包路径.UserOnLineListener</listener-class>
    <load-on-startup>1</load-on-startup>
    <description>session监听器用户在线离线</description>
    </listener>
 
在Action中重要的代码:
//记入session监听器
   /**
    * request.getRemoteAddr() 客户端的ip
    *
    */
 session.setAttribute(UserOnLineListener.LISTENER_NAME,
     new OnLineSession(request.getRemoteAddr(),u.getUserId().toString(),u.getUserAccount(),new Date().toString()));
//取出记入session监听的值
HttpServletRequest request = ServletActionContext.getRequest();  
 List sessions = UserOnLineListener.getSessions();
   List<OnLineSession> sessionList=new ArrayList<OnLineSession>();
   if(sessions!=null){  
             OnLineSession onlineSession = null;   //封装登录用户的对象
             Iterator it = sessions.iterator();  
             while(it.hasNext()){ 
                  onlineSession=(OnLineSession)it.next(); 
                  sessionList.add(onlineSession);//登录用户的工号
                  //System.out.println("用户登录的工号的序号:"+onlineSession.getKeyId());
             }
   } 
request.setAttribute("sessionList", sessionList);
 在JSP中怎样判断在线离线
<s:iterator value="result.resultlist" var="user">
           <!-- 页面级变量起控制作用 start 显示用户是否上下线问题 -->
     <s:set name="onlineValue" value="0" />
         <c:forEach items="${requestScope.sessionList}" var="online">
                      <c:if test="${online.keyId eq userId }">     
                          <s:set name="onlineValue" value="1" />
                      </c:if>  
                 </c:forEach>
          <!-- 页面级变量起控制作用 stop -->
  <s:if test="#onlineValue==1">在线</s:if>
  <s:if test="#onlineValue!=1"> 离线</s:if>
 
 
用退出的时候也要清除一下session.removeAttribute(UserOnLineListener.LISTENER_NAME)这个,以及浏览器关闭的时候也要监听一下,将session值失效
浏览器关闭清除session值 javascript
/** 监听关闭浏览器的  清除session值  */
window.onbeforeunload=function()  
{       
      var warnning = '<fmt:message key="systemMessage.exitWarning" />';
      var beforeExit='<fmt:message key="systemMessage.beforeExitWarning" />';
      if(event.clientY<0  &&  event.clientX>document.body.clientWidth-20  ||  event.clientY<0  &&  event.clientX<20  ||
         event.altKey || event.ctrlKey ||  event.clientY>document.body.clientHeight){
            //alert(beforeExit);
            //return warnning;
            window.location ='${basePath}companyManage/user!loginOut.action';//进入后台清除session值的操作
       }    
说明:这种状况也不能非常的准确,尤其是浏览器关闭的时候有可能触发不到,哎,大体上可以满足的,呵呵!!!不过在web.xml中设置一个session失效时间为30分钟即可