zoukankan      html  css  js  c++  java
  • 关于使用HttpSessionBindingListener获取在线用户数,同一用户登陆一次

      原创地址:http://blog.csdn.net/jiaoxueli/article/details/2226134

      考虑到项目中统计在线用户数量和同一用户只能登陆一次的需求,查询联系 HttpSessionBindingListener接口的使用,记录以备后用,也供同样需要的同仁参考。

    下面为我的测试例子,首先建个web工程,例子中程序包括:OnLineUser.java  ,login.jsp ,logout.jsp,onLineUser.jsp四个文件

    OnLineUser.java清单:

    package pub;

    /*
     * onLineUser类实现HttpSessionBindingListener接口
     * onLineUser类将具有HttpSessionBindingListener接口的特有属性
     * 那么HttpSessionBindingListener接口的特有属性是什么呢?
     * HttpSessionBindingListener接口具有的两个空函数
     * public void valueBound(HttpSessionBindingEvent e)
     * public void valueUnBound(HttpSessionBindingEvent e)
     * 
     * onLineUser实现一些方法:获取在线用户数
     * 
     */

    import javax.servlet.http.*; 
    import java.util.*; 

    public class OnLineUser implements HttpSessionBindingListener 
       
       public OnLineUser(){
       } 

       private Vector users=new Vector();
       public int getCount(){
           users.trimToSize();//调整Vector users的容量为Vector users的大小
           return users.capacity();//返回users的容量
       }
       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();
           System.out.println("请求:::::::::::"+e.getName());
        if(!existUser(e.getName())){
            users.add(e.getName());
            System.out.print(e.getName()+"    登入到系统 "+(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+"    退出系统 "+(new Date()));
        System.out.println("      在线用户数为:"+getCount());
       } 
       
       
    }

    login.jsp 清单:

    <%@ page contentType="text/html;charset=gb2312" %> 
    <html>
    <head>
    <title>测试HttpSessionBindingListener接口</title>
    </head>

    <body>
    <form name="login" method="post" action="onLineUser.jsp">
    <input type=text name="username">
    <input type=submit name="submit" value="登陆">
    </form>
    </body>
    </html>

    logout.jsp清单:

    <%@ page contentType="text/html;charset=gb2312" %> 
    <%@ page import="pub.OnLineUser,java.util.*" %> 
    <jsp:useBean id="onlineuser" class="pub.OnLineUser" scope="application"/>
    <html> 
    <head> 
    <title>搞定JSP在线人数</title>
    </head>
    <body> 
    <center> 
      <h1>登陆成功,欢迎您访问!</h1>
    </center>
    <% 
       String username=request.getParameter("username");
       if(username!=null&&onlineuser.deleteUser(username)){
           out.println(username+"已经退出系统!");
           session.removeAttribute(username);
           out.println("<script>window.location="login.jsp";</script>");
       }else{
           out.println(username+"已经退出系统!");
           out.println("<script>window.location="login.jsp";</script>");
       }
    %> 
    <center> 
      <p>elapsed制作</p>
      <p> </p>
      <p><a href="logout.jsp">退出系统</a></p>
    </center> 
    </body> 
    </html>

    onLineUser.jsp清单

    <%@ page contentType="text/html;charset=gb2312" %> 
    <%@page import="java.util.*,pub.*"%>
    <jsp:useBean id="onlineuser" class="pub.OnLineUser" scope="application" />
    <html> 
    <head> 
    <title>搞定JSP在线人数</title>
    </head>
    <body> 
    <center> 
      <h1>登陆成功,欢迎您访问!</h1>
    </center>
    <%   session = request.getSession(false); %> 
    <% 
       String username=request.getParameter("username");
       if (onlineuser.existUser(username)){
           out.println("用户<font color=red>"+username+"</font>已经登陆!");
       }else{
           session.setMaxInactiveInterval(600);//Sesion有效时长,以秒为单位
           session.setAttribute(username,onlineuser); 
           out.println("欢迎新用户:<font color=red>"+username+"</font>登陆到系统!");
       }
       out.println("<br>当前在线用户人数:<font color=red>"+onlineuser.getCount()+"</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>");
       }
       下面的方法也是可以的,这两种方法都是可行的,其实Iterator是Enumeration的子类
       */
       for(Iterator it=vt.iterator();it.hasNext();){
           out.println("<tr><td>");
           out.println((String)it.next()+"<br>");
           out.println("</td></tr>");
       }
       out.println("</table>");
         
    %> 
    <center> 
      <p>elapsed制作</p>
      <p> </p>
    <%
       out.println("<p><a href='logout.jsp?username="+username+"'>退出系统</a></p>");
    %>
    </center> 
    </body> 
    </html>

    该监听器不需要在web.xml中配置listener,完成后部署启动,访问login.jsp测试即可。

  • 相关阅读:
    JAVA 的赋值运算符、比较运算符、逻辑运算符、三元运算符、引用数据类型、流程语句
    Java 的方向、安装、打印“HelloWorld”、注释、标识字、关键字、变量、
    oracle组函数、多表查询、分页、
    oracle 的单行函数
    JQ 的class类的操作 效果 遍历 内置遍历数组的函数 事件
    jquery的引入、入口函数、选择器、对内容的操作、对元素的操作、属性操作
    MySQL 查询习题详解
    oracle的基本查询
    数据库45道练习题
    数据库概念以及入门语句,增删改
  • 原文地址:https://www.cnblogs.com/zhilongblogs/p/4164445.html
Copyright © 2011-2022 走看看