Jsp在线人数统计 - 实现后台强制前台某个用户退出

这是一个笨方法..我知道Tomcat内部有可以得到系统session的方法..但是我的能力没法得到相关的类...如果有高手看到这里....知道的话告诉下小弟....

 

CountOnLineUser.java
 /*
Power By 24COMIC
Design:LULU

原理
构建监听器,当有session名称为jvod_user被建立,触发监听器,调用方法
读取application中名为OLU的HashMap对象,每个HashMap的值我的程序中是一个UserItem对象
将用户session的sessionId增加到OLU中....put(用户名,sessionId)
再将整个HashMap对象保存到application中...

当用户sessiong过期或者销毁,,就删除OLU中的对象健值

e-mail:[email protected]
*/

package com.jvod.System;
import java.util.HashMap;

import javax.servlet.*;
import javax.servlet.http.*;

import com.jvod.item.UserItem;

public class CountOnLineUser implements HttpSessionAttributeListener
{
 public CountOnLineUser()
 {
  //System.out.println("-------init count");
 }
 public void attributeAdded(HttpSessionBindingEvent se)
 {
  try{
   //System.out.println("-------se.getName():"+se.getName());
  if(se.getName().equals("jvod_user"))
  {
   HttpSession session=se.getSession();
   //System.out.println("-------session创建:"+session.getId());
   ServletContext sc = session.getServletContext();
   HashMap OLU=(HashMap)sc.getAttribute("OnLineUser");
   UserItem userItem=(UserItem)se.getValue();
   if(userItem!=null)//为已登录用户
   {
    if(OLU.get(userItem.getName())!=null)//之前已经重复登录
    {
     //得到之前的sessionId
     String SessionId=(String) OLU.get(userItem.getName());
     //销毁该用户在别处登录的session
     //call remove
     //System.out.println("-------call remove same session");
     SessionManage SM=new SessionManage();
     SM.setServletContext(sc);
     //System.out.println("-------result of remove:"+SM.SessionRemove(SessionId));
    }
   
    //增加新sessionId
    OLU.put(userItem.getName(),session.getId());
    sc.setAttribute("OnLineUser",OLU);
   }
  }
  }catch(Exception e){
   System.out.println(e.toString());
  }
  
 }

 public void attributeRemoved(HttpSessionBindingEvent se)
 {
  try{
   if(se.getName().equals("jvod_user"))
   {
    HttpSession session=se.getSession();
    //System.out.println("-------session销毁:"+session.getId());
    ServletContext sc = session.getServletContext();
    HashMap OLU=(HashMap)sc.getAttribute("OnLineUser");
    UserItem userItem=(UserItem)se.getValue();
    if(userItem!=null)//为已登录用户
    {
     OLU.remove(userItem.getName());
     sc.setAttribute("OnLineUser",OLU);
    }
   }
  }catch(Exception e){
   System.out.println(e.toString());
  }
 }

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

}

然后用java.net.HttpURLConnection模拟客户端

public boolean SessionRemove(String sessionId)
 {
  try{

..................
URL url = new URL(前台用户销毁session页面)
HttpURLConnection conn = null;
conn=(HttpURLConnection)url.openConnection();|
conn.setRequestProperty("Cookie", "JSESSIONID="+sessionId+";"); //设置用户的session id

.......

}

发送用户session,模拟客户端访问含有session.removeAttribute("jvod_user");的页面即可完成强制退出功能

 

后台页面就是读取application中的OLU对象遍历HashMap得到用户列表...和sessionID,处理退出的页面就调用以上函数就可以了...

 

你可能感兴趣的:(jsp,exception,session,HashMap,application,import)