用java实现同一账号不能同时登录,要求能写上源码。

解决方案 »

  1.   

    SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录)package com.test;import javax.servlet.http.*;import java.util.*;public class SessionListener implements HttpSessionListener{    private static HashMap hUserName = new HashMap();//保存sessionID和username的映射    /**以下是实现HttpSessionListener中的方法**/    public void sessionCreated(HttpSessionEvent se){    }        public void sessionDestroyed(HttpSessionEvent se){        hUserName.remove( se.getSession().getId() );    }    /*     * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法     * @param sUserName String-登录的用户名称     * @return boolean-该用户是否已经登录过的标志     */    public static boolean isAlreadyEnter(HttpSession session,String sUserName){        boolean flag = false;        if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)            flag = true;            //遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)            Iterator iter = hUserName.entrySet().iterator();            while (iter.hasNext()) {                Map.Entry entry = (Map.Entry)iter.next();                Object key = entry.getKey();                Object val = entry.getValue();                if( ( (String)val ).equals(sUserName) ){                    hUserName.remove(key);                }            }            hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username            System.out.println("hUserName = " + hUserName);        }        else{//如果该用户没登录过,直接添加现在的sessionID和username            flag = false;            hUserName.put( session.getId(),sUserName );            System.out.println("hUserName = " + hUserName);        }        return flag;    }    /*     * isOnline-用于判断用户是否在线     * @param session HttpSession-登录的用户名称     * @return boolean-该用户是否在线的标志     */    public static boolean isOnline(HttpSession session){        boolean flag = true;        if( hUserName.containsKey( session.getId() ) ){            flag = true;        }        else{            flag = false;        }        return flag;    }}web.xml部署于/App/WEB-INF下<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"><web-app><listener><listener-class>com.inspirer.dbmp.SessionListener</listener-class></listener></web-app>应用部分1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin")既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.
      

  2.   

    用的着写源码吗??登陆的就把信息存入SESSION,在用这个信息登陆的就去与SESSION对比,如一样,就是重复登陆嘛,中间就加了一个判断,还写什么源码
      

  3.   

    如果两个人在两个不同的地方登陆 session没法判断吧
    可以在数据库中用户表建立一个字段,标志是否登陆,
    若标志为已登陆,在其他人登陆时弹出提示,若标志为未登录则其该用户可登录
    若登陆长时间不操作超时则强制将字段标志为未登录并需要超时用户重新登陆
    暂时就想到这个方法
      

  4.   

    当然是把数据库中的登陆状态记录下来
    比如表中一个字段为state,值为1时已登陆
    另一个地方登陆就查看用户是否已登陆
      

  5.   


    此法还有缺陷,如果不是由于时间长而是用户自己手动关掉浏览器呢?那如果得知去改变数据库的状态呢?
     还要要用监听session的可以结合起来一起用
      
      

  6.   

    登陆的时候判断session中用户 就OK了
      

  7.   

    Web形式没办法实现,因为没办法监控用户是否关闭了浏览器。
    如果用session的话,用户关闭浏览器后等到session超时了才可以知道用户退出了。
    除非写个Ajax没几秒就访问一下服务器。
      

  8.   

    对于session来处理这个问题,暂时没法实现的,因为你不知道在什么时候销毁session,而对与在数据库中加个字段也是不行的,因为但用户没有按照正确的方法推出系统,例如直接关闭浏览器那么这个方法就是行不通的。希望大家在帮我想想解决的方法,小弟不盛感激。
      

  9.   

    我个人认为没必要,WEB的这样做很麻烦。
      

  10.   

    如果想简单的实现,并且你的帐号是唯一的  那可以把帐号放在集合中用session保存,登录的时候比较就行了!
      

  11.   

    用session 记录登录的用户名,如果session里有值了,就说明用户已经登录了
      

  12.   

    一般都是在数据库中记录状态 而且异常不是那么容易就出的(出现异常是说服务器出现异常 不是客户机)加个SESSION的监听器 用户SESSION无论是注销还是增加都进行更新 就能保证不出问题了
      

  13.   


    如果用户在登陆状态下,服务器崩溃或者重启呢?这时候数据库字段还是在线状态,用户再次登陆时候怎么办?我觉得还是在服务器建一个list或者map之类的东西用来存放所有在线用户信息,登陆的时候比较判断就行
      

  14.   

    增加一个全局context,记录所有登录人员的信息。其实系统监控应该也需要这样的信息。然后通过这些登录人员信息再对登录人员进行比较。(一般来说不允许2人同时登陆。后来者踢掉先登录者)。至于怎么维护这个全局信息,可以采用轮询或者别的方式。
      

  15.   

    建议用session监听加数据库字段标志两者结合的方法
    1.session监听可以随时监听用户登陆和session失效
    2.登陆标志位存在数据库中减少服务器的缓存
      

  16.   


    我还以为是我回复的session有超时且用户关闭网页的时候session没到超时时间还是存在的  数据库  用户关闭网页  还是不行  断电更不行做个用户关闭网页的监听   关闭的时候注销用户  
      

  17.   

    先设置session 的有效期为10秒(设置比较短的时间)
    在页面上写 用js 访问session的代码(可以使用ajax)(用定时器 定时访问当前登录用户的session,保持 session的可用性)。
    当浏览器异常退出,或者被关闭, session将不会再被访问到,这样session超时10秒,就会销毁。 或者用户注销 ,服务器主动销毁session。当一个用户登录的时候 只要浏览器没有被关闭,session应该是一直都有效的。 只要用户一关闭浏览器。过十秒后,session就会超时销毁。当一个用户已经登录,这个账户再次登录的时候,只需判断是否在session存在。。如果存在 则是已经登录 不存在则没有登录 这样就可以处理很多的异常情况,例如:浏览器被任务管理器强制关闭。。