這是一個笨方法..我知道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:smildlzj@hotmail.com
*/
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,處理退出的頁面就調用以上函數就可以了...