原理: 建立一个Session级别的Listener,然后在Session建立的时候往Application的一个向量变量List中写入用户信息,当Session释放时从变量List中删除该用户信息,就可以在Application的列表中得到在线用户列表了。
- import javax.servlet.http.*;
-
import javax.servlet.*;
- import java.util.*;
- public class onLineUser implements HttpSessionBindingListener {
-
private Vector users=new Vector();
-
-
public int getCount(){
- users.trimToSize();
-
return users.capacity();
- }
-
-
public boolean existUser(String userName){
- users.trimToSize();
-
boolean existUser= false ;
- for (int i=0;i <users.capacity();i++ )
-
{
- if (userName.equals((String)users.get(i)))
-
{
- existUser=true;
-
break ;
- }
-
}
- return existUser;
-
}
-
public boolean deleteUser(String userName) {
- users.trimToSize();
-
if (existUser(userName)){
- int currUserIndex=-1;
-
for ( int i=0;i <users.capacity();i++){
- if(userName.equals((String)users.get(i))){
-
currUserIndex=i;
- break;
-
}
- }
-
if (currUserIndex!=-1){
- users.remove(currUserIndex);
-
users.trimToSize();
- return true;
-
}
- }
-
return false ;
- }
-
- public Vector getOnLineUser()
-
{
- return users;
-
}
- public void valueBound(HttpSessionBindingEvent e) {
-
users.trimToSize();
- if(!existUser(e.getName())){
-
users.add(e.getName());
- System.out.print(e.getName()+"/t 登入到系统/t"+(new Date()));
-
System. out .println( " 在线用户数为:" +getCount());
- }else
-
System. out .println(e.getName()+ "已经存在" );
- }
-
- public void valueUnbound(HttpSessionBindingEvent e) {
-
users.trimToSize();
- String userName=e.getName();
-
deleteUser(userName);
- System.out.print(userName+"/t 退出系统/t"+(new Date()));
-
System. out .println( " 在线用户数为:" +getCount());
- }
-
}
-
JSP程序
-
jsp:
- <%@ page contentType="text/html;charset=gb2312" %>
-
<%@ page import= "java.util.*" %>
- <jsp:useBean id="onlineuser" class="temp.jb.onLineUser" scope="application"/>
-
<html>
- <head>
-
</head>
- <body onUnload="postMessage()">
-
<center>
- <p> <h1>登陆成功,欢迎访问 </h1> </p>
-
</center>
- <% session = request.getSession(false); %>
-
<%
- String username=request.getParameter("username");
-
if (onlineuser.existUser(username)){
- out.println("用户 <font color=red>"+username+" </font>已经登陆!");
-
} else {
- session.setMaxInactiveInterval(50); //Sesion有效时长,以秒为单位
-
session.setAttribute(username,onlineuser);
- out.println("欢迎新用户: <font color=red>"+username+" </font>登陆到系统!");
-
}
- out.println(" <br>当前在线用户人数: <font color=red>"+onlineuser.getCount()+" </font> <br>");
-
String ip = request.getRemoteAddr();
- out.println(" <br>IP: <font color=red>"+ip+" </font> <br>");
-
Vector vt=onlineuser.getOnLineUser();
- Enumeration e = vt.elements();
-
out .println( "在线用户列表" );
- out.println(" <table border=1>");
-
out .println( " <tr> <td>用户名 </td> </tr>" );
- while(e.hasMoreElements()){
-
out .println( " <tr> <td>" );
- out.println((String)e.nextElement()+" <br>");
-
out .println( " </td> </tr>" );
- }
-
out .println( " </table>" );
-
%>
- <center>
-
<p> </p>
- [ <a href="javascript:window.close()">关闭窗口 </a>]
-
<%
- out.println(" <p> <a href='logout.jsp?username="+username+"'>退出系统 </a> </p>");
-
%>
- </center>
-
<Script>
- function postMessage(){
-
<%onlineuser.deleteUser(request.getParameter( "username" ));%>
- }
-
</Script>
- </body>
-
</html>