限制用户登录/判断用户在线的问题

限制用户登录 / 判断用户在线的问题

 

最近搞个限制多个用户登录的问题,本以为很简单,结果想了很久都没弄出来,在网上也不曾找到答案;后来终于找到了解决的办法,觉得不错,特拿来分享。

解决这个问题有多种方法,思路一是做成长连接形式的,这个思路有多种实现方法,我见过的如服务器推,实现起来挺困难的,我看过相关的一下资料,没有深入研究。

思路二是存数据库,这个方法比较容易想,网上也有。思路就是 ajax 定时刷新,比如隔 1 分钟向数据库插入当前在线时间,自然 user 表里面有个记录当前时间的字段,登录的时候取出字段的值和当前时间比较,超过一分钟就说明下线了,我开始想到的就是这种。很显然这个弊端很大,定时插入数据库有损系统性能,具体代码就不写了。

思路三是存内存,实现方法和思路二差不多,不同的是它存的是内存,本质上没有改变什么,还是要 ajax 定时刷新,区别是给数据库减轻了压力,下面简要的说下方法。

1. 建一个类,定义一个静态集合,用来存放用户名和当前在线时间;

public class UserOnline

    {

       private static Dictionary <int , string > onlineuserlist = null ;

       public static Dictionary <int , string > GetOnlineUser()

       {

           if (onlineuserlist == null )

           {

               onlineuserlist = new Dictionary <int , string >();

           }

           return onlineuserlist;

       }

  }

2.ajax 定时刷新;

[AjaxPro.AjaxMethod ]

    public int SetOnlieTime()

    {

 

        int flag = 0;

        try

        {

            Dictionary <int , string > userlist = UserOnline .GetOnlineUser();

            if (userlist.ContainsKey(Convert .ToInt32(Session["userid" ].ToString().Trim())))

            {

                userlist[Convert .ToInt32(Session["userid" ].ToString().Trim())] = DateTime .Now.AddMinutes(1).ToString("yyyy-MM-dd HH:mm:ss" );

            }

            else

            {

                userlist.Add(Convert .ToInt32(Session["userid" ].ToString().Trim()), DateTime .Now.AddMinutes(1).ToString("yyyy-MM-dd HH:mm:ss" ));

            }

            flag = 1;

        }

        catch { }

 

        return flag;

}

3.js 调用上面的 ajax 方法;

function updatetime()

   {

        if (Frameclsss_class1_left.SetOnlieTime().value==1)

        {

            window.setTimeout("updatetime()" ,60000);

        }

        else

        {

            alert(' 服務器斷開連接,請檢查你的網絡再訪問!' );

            window.parent.location.href='../../Default.aspx' ;

        }

}

< body onload =" updatetime();">

 

4. 登录时先判断用户名和密码,然后判断时间;

if (myReader.Read())

            { 

                Dictionary <int , string > userlist = UserOnline .GetOnlineUser();

                bool timeflag = false ;

                 if (userlist.ContainsKey(Convert .ToInt32(userid)))

                {

                    timeflag = DateTime .Now.ToString("yyyy-MM-dd HH:mm:ss" ).CompareTo(Convert .ToDateTime(userlist[Convert .ToInt32(userid)]).ToString("yyyy-MM-dd HH:mm:ss" )) < 0 ? true : false ;

             } ……

 

思路四就是用 session application 等,个人觉得用不好,自个试试就知道了。

 

结束语:这里主要推荐的是第三种方法。觉得存内存这个想法好,很多需要支持大量查询的表,我们都可以建立内存表,直接从内存中读取,想必速度是要快很多的(本文仅供参考,如有误导,还望见谅) .

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值