这是一个笨方法..我知道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,处理退出的页面就调用以上函数就可以了...