当前位置:  技术问答>java相关

请教一个登录问题,很简单的,我急用,50分,一定给分!!!

    来源: 互联网  发布时间:2015-03-22

    本文导语:  请问各位大侠,当一个用户登录后,另一个用户不能再用此用户名登录系统,请问如何实现这一功能,有没有做过的,能不能提供点原代码,谢谢了! | 建立一个登录登记表(signin表) 里面有...

请问各位大侠,当一个用户登录后,另一个用户不能再用此用户名登录系统,请问如何实现这一功能,有没有做过的,能不能提供点原代码,谢谢了!

|
建立一个登录登记表(signin表)
里面有用户名(username),客户端IP地址(ipadd)。
用户登录时先查询signin表中是不是有用户的IP地址,如果没有在signin表中插入一条纪录。
然后设置一个session,用户访问页面时都监测session是不是有效,没有效的话就从signin表中删除ipadd字段和用户IP地址相同的记录。
这样可以实现重复登录。
但是这样做有缺点,就是如果多个用户都通过统一台防火墙或代理服务器上网就会有IP地址重复。
所以我的办法也不好。
如果哪位高手有解决的办法,请指教。

|
利用servlet是线程的特性,使用共享数据区(一般使用只有唯一实例的对象)存放已登陆用户和登陆时的sessionID,用一个线程来监测登陆用户是否退出。

|
在数据库里边设置一个标志,当用户登陆的时候把标志置位。
你在登陆的时候查看一下这个标志,如果没有置位,就让他登陆,有的话就给他踢了!
在下线的时候你可以给标志复位。
检查下线用线程,只要用户登陆就起一个,一段时间去查看他掉了么,掉了就复位。
还有一个方法,(前提是用户少),你可以一次读取所有的用户存放到session里边。当一个用户登陆进来就把他从session中去掉,所有的用户必须是session里的。(session可以存放ArrayList,取出来的时候必须进行强制转换)。这样行么?检查ip太累了。

|
有个最典型的例子
用连接池和Hash表的用户登陆人证

登陆的bean是application
维护一个hash表,键就是userName
值是一个类,里面有个isLogin的属性,记录用户是否已经登陆,
还有其他的属性,如登陆时间,是否超时等

大概就是这样的思路,你可以到网上找到有关的例子

|
to xsulver:
如果客户端的浏览器用完之后就退出了,但是没有做logout操作,那下次岂不是就登录不进来了吗?
看了各位的答案,只有whd11808涉及了这个问题的难点:在数据库里或者javabean里设标志谁都能想得到,但是怎么才能保证用户退出的时候把这个标识复位呢?要知道用户用的是浏览器,它可以直接alt+f4呀!
whd11808提供了线程的方法,不过要是用户很多怎么办?1000个用户代表着有1000个线程时不时执行一次,开销很大的呀!

|
呵呵!看来大家挺看好我的方法啊!呵呵,下边是我以前做的,网络qq的一部分,大家看看吧。
package easytalk;

import java.util.*;

/**
*存储在线用户信息的JavaBeans
*自动将久未连线的用户踢出列表
*/
public class userList
{
//所有的用户名
private HashMap userList;

//用户聊天中两次输入的最大间隔
//大于此间隔时需要重新登录
private int activeTimeLimit = 60000;

/**
*构造函数,不包含任何参数
*/
public userList()
{
userList = new HashMap();
}

/**
*取得一个包含当前用户信息的迭代器
*@return 包含当前用户名信息的Iterator类型对象
*@see java.util.Iterator
*/
public Iterator getUserList()
{
//将超时用户踢出列表
removeOverdue();
//构建一个迭代嚣并返回
HashMap returnUserList = new HashMap(userList);
Set returnUserSet = returnUserList.keySet();
Iterator returnUserIterator = returnUserSet.iterator();
return returnUserIterator;
}

/**
*更新原有用户
*@param userName 需要加入的用户名
*@param id       需要加入的用户标识
*/
public void updateUser(String id,String userName,String userPic)
{
//获得当前时间
Vector userInfo=new Vector(3);
Date dateTimeNow = new Date();
long longTimeNow = dateTimeNow.getTime();
Long longOTimeNow = new Long(longTimeNow);
userInfo.add(id);
userInfo.add(userPic);
userInfo.add(longOTimeNow);
//将用户最近一次发出的时间存储起来
userList.put(userName,userInfo);
}

/**
*监测用户是否在用户列表中
*/
public boolean isUserOnLine(String userName)
{
//将超时用户踢出列表
removeOverdue();
return userList.containsKey(userName);
}

/**
*将用户加入到此用户列表中
*@param userName 需要加入的用户名
*/
public void addUser(String id,String userName,String userPic)
{
//获得当前时间
Vector userInfo=new Vector(3);
Date dateTimeNow = new Date();
long longTimeNow = dateTimeNow.getTime();
Long longOTimeNow = new Long(longTimeNow);
userInfo.add(id);
userInfo.add(userPic);
userInfo.add(longOTimeNow);
//将用户最近一次发出的时间存储起来
userList.put(userName,userInfo);
}

/*将超时用户踢出列表
*按照方法setActiveTimeLimit()设定的时间间隔
*/
public void removeOverdue()
{
//为了防止进行枚举时有其他用户访问原有的HashMap
//造成java.util.ConcurrentModificationException异常
//这里建立一个新的HashMap对象来进行枚举
HashMap temp = new HashMap(userList);
Set nameSet = temp.keySet();
Iterator nameIterator = nameSet.iterator();

//将在线用户列表中的用户数据取出
while (nameIterator.hasNext())
{
//获得用户最近一次发出的请求的时间
String name = (String) (nameIterator.next());
Vector returnVector =(Vector) userList.get(name);
Long longOLastAccessTime = (Long)returnVector.get(2);
long longLastAccessTime = longOLastAccessTime.longValue();

//获得当前时间
Date dateTimeNow = new Date();
long longTimeNow = dateTimeNow.getTime();

//检查用户是否超时
//如果用户超时就将用户踢出用户列表
//其中activeTimeLimit是预先定义的超时时限
if (longTimeNow - longLastAccessTime > activeTimeLimit)
{
userList.remove(name);
}
}
}

/**
*得到用户再次操作的最大允许时间间隔
*@return 最大允许时间间隔,以毫秒计算
*/
public int getActiveTimeLimit()
{
return activeTimeLimit;
}

/**
*设定用户两次操作的最大允许时间间隔
*@param activeTimeLimit 需要设定的最大允许时间间隔,以毫秒计算
*/
public void setActiveTimeLimit(int activeTimeLimit)
{
this.activeTimeLimit = activeTimeLimit;
}
}

|
在数据库中设置一个标志.
 

|
或在aplication中设置标志

    
 
 

您可能感兴趣的文章:

  • 请教一个查找字符的脚本。急用!!
  • 请教一个常识问题,mm急用
  • 请教TAB键的ASCII值!急用!(100分求答!)
  • 急!请教高手:在Solaris系统中,对于远程telnet方式,发现只有root用户登录成功,其他用户不能登录,报no shell错误,是什么原因?
  • 请教有关ssh登录问题
  • 请教FTP不能登录问题
  • 请教如何避免不登录就直接访问一个jsp文件
  • 请教个su登录root问题
  • 请教一个用户登录的问题
  • 请教:关于UNIX 远程用户FTP登录权限配置问题
  • 请教:如何在windows环境下以图形界面登录linux?
  • 请教Linux 远程登录(rlogin)的问题
  • 请教用linux9装好mysql后,系统root用户无法登录,该怎么办?
  • 高分请教,如何在FreeBSD上制作以web方式的控制台?就像那些ADSL Moden之类的硬件通过在在IE上输入http://192.168.1.1然后通过登录就可以
  • 请教使用putty以telnet方式登录并运行程序出现的乱码问题
  • 请教一个能自动登录FTP 服务器的脚本的 写法? ———— 搞定立刻给分。
  • Fedora 7 下 root用户登录后设置了JAVA_HOME, CLASSPATH等参数,可是总在重启后 终端命令行报错bash:JAVA_HOME:command not found,请教原因!
  • 请教一个用户登录的问题,谢谢!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3