关于保证web登陆用户唯一性的问题?

zhanghuazhanghome 2004-08-15 08:24:58
为了保证web用户登陆的唯一性,我们通常在用户信息表中设置一个字段。例如,用户A登陆后设置字段f_islogin=1,当有另外一个人用用户A再次登陆时,我们效验f_islogin是否为1,为1就禁止用户A的再次登陆,当用户A从这个网站退出时,我们用一个方法B将字段f_islogin重新置为0即可, 但是通常来说,用户从一个站点退出就是直接关掉这个网站的网页,我们的方法B是不执行的,请问有什么方法解决吗?或有别的思路告诉我,谢谢
...全文
640 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
spiritsl 2004-08-19
  • 打赏
  • 举报
回复
在session中增加标志为,比如当一个用户a登陆前session.getAttribute("user","a");
如果存在则不能登陆,
否则

session.setAttribute("user","a");

登陆
superfishmanweb 2004-08-19
  • 打赏
  • 举报
回复
我总是觉得单独用缓存难控制,不安全,最好就配合数据库一起使用,哈哈!
MitnickChen 2004-08-19
  • 打赏
  • 举报
回复
有一种方法你可以考虑一下:
(1)建立一个Application("g_AllLoginAccount") = "";
(2)每登陆一个人,就把其帐号跟这个Application变量对比,看其是否含有该帐号;
(3)如果有,则提示该帐号已经登陆,然后再把其重定向到你想定向的页;如果没有,则把这个帐号的值追加到Applicaiton变量,并PASS!
tangbow 2004-08-19
  • 打赏
  • 举报
回复
可以用application呀
kingmaxno1 2004-08-19
  • 打赏
  • 举报
回复
我用了和 zhanghuazhanghome(517(张)) 差不多的方法,但是如果是点击右上用的关闭按钮关闭的话,退出监听的程序就不起作用,怎么解决呀
yyqllxh2004 2004-08-19
  • 打赏
  • 举报
回复
用session控制一下应该可以的
zhanghuazhanghome 2004-08-19
  • 打赏
  • 举报
回复
to superfishmanweb:
我现在的实现方式是这样的,用HttpSessionBindingListener监听用户的登陆情况。但是这种监听器要求在登陆和下线时判断用户是否已经存在,登陆时当然时可以的,在用户点击登陆按钮时加代码判断即可,没有登陆就将用户帐号放入一个vector中,但用户退出网站时我没有方法保证用户一定触发我的事件(将用户名从vector删掉),我暂时按照一下方法处理,定义一个String数组data放在vector中(data[0]=用户IP,data[1]=用户最后一次操作我的网站的时间,data[2]=用户帐号),代码判断方式如下:
for(int i=0;i<vec.size();i++){
String clientIP=用户IP
String username=用户帐号
long curtime=new Date().getTime();
String[] data=vec[i];
if(username.equals(data[2]){
if(data[0].equals(clientIP)){
//同一个IP登陆,就是在一台机器上再次登陆,就让其登陆了,更新data[1]即可

}else if(IP不同 && 登陆时间和data[1]中相差了20分钟(session过期时间)以上){
//允许登陆,更新data[0],data[1]
}
}
}
vec中没有匹配的,即新用户登陆,允许即可
但这样还有个问题存在,我设置的时间为20分钟,如果一个用户帐号20分钟一直在使用,我就不能将其使用的这段时间算在过时的20分钟内,
问一下,有没有什么监听器可以知道用户在我的网站的浏览?HttpSessionListener也不行的
zhanghuazhanghome 2004-08-19
  • 打赏
  • 举报
回复
IP判断的缺陷还有一个:如果用代理上网,只能得到代理的IP,这样可能20分钟内所有用这个代理的用户都不能进来了
zhanghuazhanghome 2004-08-19
  • 打赏
  • 举报
回复
至于用Application,我的实现方法类似于它,但是缺陷同样,假如设置session过期时间20分钟,如果我登陆后关闭IE退出网站,恐怕20分钟内这个用户就不能用了吧,我的IP判断的方式,起码同一台机器可以随意登陆
zhanghuazhanghome 2004-08-19
  • 打赏
  • 举报
回复
的确,登陆时判断用户是否已经存在实在是简单不过,因为用户必须点击我们的登陆按钮我们才允许其进入我们的系统,但退出呢?如果每一个客户增加一个基本字段,置一个标志,我退出是直接关闭了IE,那么除非重启server,或手工到库中update标志,否则,这个用户就再也不能用了,不是吗?
suntmbxh 2004-08-19
  • 打赏
  • 举报
回复
一般来说,Web服务器是用session来跟踪客户的状态的,因为客户登录后,Servlet 容器会为客户分配一个唯一的标识符,即Sessin ID,然后客户登录时你应该将客户的登录信息保存在session中(因为每个客户都有一个session,所以不会弄错),session.setAttribute("username",username)`中,然后你在每个网页中都对session进行验证,例如session.getAttribute("username")的值是null,那就是未登录就访问该网页的,这样就可以知道谁在访问该网页,同时你可以设置最大时间,如20分钟,过时就算自动退出.
至于说重复登问题,你可以在数据库为每一个客户增加一个基本字段,即客户状态,如1表示已登录,0表示未登录,然后在客户登录时只要检查一下该字段的值就行了,在客户退出时或超时时,把客户状态字段改为0就行了,
edhappy 2004-08-17
  • 打赏
  • 举报
回复
学习一下
shanzaid 2004-08-17
  • 打赏
  • 举报
回复
0210(DBoy) 能不能说的详细一点,怎么实现?
power17 2004-08-17
  • 打赏
  • 举报
回复

我的方法很笨,就是在数据库中另外添加一个标志变量,如boolean flag.开始时让它=false

登陆以后让它变成true(这个容易),关闭时变成false(这个是不是要用到javascript).每次

登陆时检查这个值是什么,是true,说明已经登陆。

只是随便说说。
世宝宝 2004-08-17
  • 打赏
  • 举报
回复
这些东东使用缓存就行啦,数据库操作太昂贵了
superfishmanweb 2004-08-17
  • 打赏
  • 举报
回复
如果用attributelistener就可以监听到sessionid的创建与关闭的情况.而我在上面提到的另外一种方法是退出(或刷新的时候,因为用的是onunload)的时候用window.open打开一个不可见的页,在页里面再判断其它的页有无关闭(包括自己那一页),至于判断的方法是用sessionid,和window.opener.closed等的组合使用(根据不同的情况组合).
zhanghuazhanghome 2004-08-15
  • 打赏
  • 举报
回复
to superfishmanweb:我要的效果是当一个人用帐号a登陆后,别人不能同时用a登陆,另onUnload方法是可以,但我怎么判断下列情况 ,用户打开了我的网站上的A,B,C三个页面,怎样知道那个页面最后关闭?
zero_3 2004-08-15
  • 打赏
  • 举报
回复
我只是听懂了问题,没明白楼上怎么实现的。:(
superfishmanweb 2004-08-15
  • 打赏
  • 举报
回复
刚好做完这东西,方法就是利用application在第二次登陆的时候将第一次的sessionid失效,然后再从设置过。最好配合数据库来用退出的时候就在利用onunload运行一个不可见的弹出窗口进行数据库的操作。
还有一种方法是用AttributeListener+SessionListener来做。这种方法我掌握得不好所以用了上面那一种,效果不及这个因为这个方法的逻辑结构比上面的简单但技术水平要高一点。
张海霖 2004-08-15
  • 打赏
  • 举报
回复
张三登录是检查session("张三")是不是空,是空,就允许,不是空就不允许。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧