如何限制同一帐号不能同时多次登录或同时在线? 为了避免同一帐号,在不同地点同时登录,请问在系统中怎么实现?系统每次登录时,把UserInfo信息放到了session中了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单实现:http://dotnet.aspx.cc/article/CF5FFABC-CFE1-4368-3C13-9B4FCD7C7168/read.aspx也可以放数据库 http://dotnet.aspx.cc/Exam/SingleLogin.aspx可以使用相同的用户名字和密码在2个地方测试 to net_lover(【孟子E章】) :你的这个可能会出现问题,在同一台客户端,一个帐号登录后,又退出,然后又登录,你的cache没有清掉,反而不能登录了,用户退出后马上登录的可能性很大哦,如果能够区别出不是同一个客户端登录的就好了 判断离线以超时为主要依据,而不是等待用户点击注销。另外,用户直接关闭窗口就默认为注销,临时转到其它url则要等超时(而不是认为是注销)。超时判断以10~60秒钟为好再长了就无法用了(同一账号无法及时登录)。你可以使用iframe或者ajax方法,让用户页面异步访问后台,后台从Session中获取用户的账号信息,然后再数据库中记录最后一次访问时间。 数据库可以这样设计三个字段: SessionID,用户账号,最后访问时间然后判断“当前用户是否重复登录”的程序判断同一个用户账号是否已经在其它会话中登录(未超时),同时顺便把超时的记录删除掉(显然不删除也没有逻辑错误)。预先确定一下业务逻辑,是禁止重复登录还是后登录的用户把前边的“踢掉”,如果是后者还要多设计一点处理逻辑。 你最好将这个写为一个WebService(此时需要配置WebService启用Session),单独找一个比较稳定的空间部署。这个WebService应该具有同时服务上万客户端的能力。 我的面板上有 安全退出 和 注销 按钮,但如果强制用户使用 这两个按钮恐怕不尽人意,习惯上还是用IE的关闭,用户肯定闹翻天不可,如果把session失效时间设小,也不太可能,有些功能需要长时间才能完成,我目前设置的是30分钟,如果能够判断是同一个客户端的登录,就可以解决这个问题 我有个想法在Application_Beign事件中创建用户登陆Cache对象Cache 对象包含两个内容 用户id 和 最近活动时间在Session_BeginRequest 事件中这样处理先判断Cache中是否有该用户存在, 存在的话, 则更新最近活动时间. 否则的话把当前用户Add到Cache中. 并更新数据库中的状态字段 标志用户已登陆后台用用Timer每5分钟检测一次缓存(具体看你的业务需求), 用当前时间 - Cache中的最近活动时间 如果大于某个特定的值 比如1分钟, 则更新数据库表的状态字段 标志用户已离线,并清除Session 或 Cookies我觉得可行. 大家觉得呢 讨论一下` 不过这样的话有个弊端 就是正常登陆的用户 没有点登陆按钮 或者关闭浏览器的话 如果在一分钟内没活动. 也会被强制离线. 汗 呵呵` 怎么弄来弄去. 感觉还不如Session了 点注销HttpContext.Current.Cache.Remove(Session[System.Configuration.ConfigurationSettings.AppSettings["connstr1"]].ToString()); Session.Abandon(); Session.Clear(); Response.Redirect("Login.aspx");直接关闭浏览器<body onbeforeunload='window.location.href = "LoginOut.aspx";'>if(HttpContext.Current.Session[System.Configuration.ConfigurationSettings.AppSettings["connstr1"]]!=null) { HttpContext.Current.Cache.Remove(HttpContext.Current.Session[System.Configuration.ConfigurationSettings.AppSettings["connstr1"]].ToString()); } to szc21(if(开源||免费){return 支持}) :判断是否在线已不是难点,用net_lover(【孟子E章】) 的方法就可以,为了处理非正常退出的情况,包括直接关闭浏览器,这种“假”在线的情况,用唯一标识是最有效的方式!上面高手们的回答,没有一个能有效解决非正常退出情况,如缩短失效时间、用WebService,用数据库锁、冲掉上一个登录等等,都不好我用唯一标识的思想 就是 同一个客户端可以任意登录,我的这个需求是为了防止盗号操作业务数据,而不是去统计在线人数,在同一个客户端用相同的帐号登录,一般不会是盗号,所以我会允许这种情况 我的session失效时间设定30分钟,不可能会缩短,而且用户还有可能会加长这个时间,大家不要考虑1分钟的事情 to flaigd(努力学习.相信自己 :)) :用Timer检测缓存,跟用session有什么不同么 搞个online表,其中有个字段叫TmpKey,登陆的时候验证密码通过后,生成一个随机的TmpKey和用户ID组成数据放进去,以后每次验证用此核对,也就意味着如果其他人登陆了就会更改TmpKey,那么前面的人就会失败,那么就永远只有一人登陆,基于此还可以实现为允许多少人同时登陆,而且不存在以上出现的问题。 TmpKey可以存在cookie中或者session中,如果放在cookie中怕别人盗用还可以结合IP等做一些加密。 这问题有这么难吗 ?说说我的做法:(未必是最好的办法)加一张Online表 用来记录当前在线的用户,用XMLHTTP割30秒刷新一次最后在线时间,使其等于当前服务器时间当用户登陆时,判断该用户是否存在于Online表中,如果存在那么(当前时间-最后在线时间)是否大于35秒,如果大于或者不存在该用户那么就允许登陆,否则(当前时间-最后在线时间)小于35秒则不允许登陆,说明该用户正在线备注:上面说的30秒与35秒视用户需求与服务器性能决定 时间越长则节约资源,但是用户非正常退出重新登陆的时间越长 我想30秒大家都容易接受. 在数据库里设个是否在线的字段吗用条If语句就得了session超时时就刷新网页重连数据库判断用户IP就行了吗 同意asp600(剑气潇潇)的观点,我也是这样来实现的. 偶个人感觉没有个完好的解决办法主要是关闭浏览器或非法关机(重启)之类得不到好的解决,有人说如果叉掉ie的关闭按钮,在事件onbeforeunload中向服务器发出请求来更改登陆信息,这样是可以解决,但用户登陆后可能开了好几个窗口,关掉一个,其他就用不了.非法关机没办法解决的关注,继续看讨论... 偶个人感觉没有个完好的解决办法主要是关闭浏览器或非法关机(重启)之类得不到好的解决,有人说如果叉掉ie的关闭按钮,在事件onbeforeunload中向服务器发出请求来更改登陆信息,这样是可以解决,但用户登陆后可能开了好几个窗口,关掉一个,其他就用不了.非法关机没办法解决的关注,继续看讨论...___________________________________________________________________加一张Online表 用来记录当前在线的用户,用XMLHTTP割30秒刷新一次最后在线时间,使其等于当前服务器时间——————————————————————————————这已经解决了关闭浏览器与非正常退出的问题了 使用token(令牌),douban.com就是这样做的,你在另一个地方登录就会颁发一个新token给新的PC,而原来登录那台PC保存的token自然无效。流程:1.用户登录,生成一个token(精确的DateTime或GUID之类的),然后保存到数据库和客户端Cookies。2.用户浏览时,每次都是用Cookies的token和数据库的比较,确认是否为有效token。3.一旦用户在别的地方登录,将颁发新的token,由于数据库中原来的token已经被新的覆盖,所以原来的登录自然失效。 正在做VIP的系统 学习 cat_hsfz(我的Blog在http://purl.oclc.org/NET/cathsfz) 的方法感觉可行,用XMLHTTP割30秒刷新一次的方法有点太耗资源吧-------------------------Cookies的token和数据库结合,能够解决我的问题,大家讨论一下有没有缺陷,没有隐患的话,就用这个了 to cat_hsfz(我的Blog在http://purl.oclc.org/NET/cathsfz):您也太敬业了,凌晨1点还在工作!!! 用登陆时间判断不行么?把登陆时间写到session里 象楼上说的 直接关闭浏览器 会不会调用 global里的 session_end 方法啊 直接这样.登陆时检查if (Session["UserName"]!=null || Session["UserName"]!=""){ 登陆.并将username写入session["UserName"]}else{ 同一账号已登陆。}如果要使本机可以重新登陆的话。你就加个ip到session一样的判断。同理 上面写错了。写反了。你自已改一下.应该是if (Session["UserName"]==null || Session["UserName"]==""){ 登陆.并将username写入session["UserName"]}else{ 同一账号已登陆。} 我觉得asp600(剑气潇潇) 的方法可行 写到Application["longined"]然后用分割字符串获得已经登录得人,查找。以前做asp聊天室时这么处理的。 简单的问题,写在COOKIE里,封装PAGE 用Application不行吗?很简单啊,30分钟轮询一次就好了阿…… 以上都没有说到重点其实难点就是“如何点浏览器右上方的X按钮,可以把session清除,就是这个问题”,如果会的,请详细把代码帖出来,不要打中文。 http://community.csdn.net/Expert/topic/4971/4971568.xml?temp=.6345331 我得见解 随便在数据中user——id设置一个字段 online 呵呵 当某用名 登陆时 online为1 当同样的用户名登陆时 online已经为1 则不能登陆 永远只有一个用户可以用某一个用户名登陆! 你可以用状态互斥来实现。关键在于:新用户在新“地点”登录之后(根据IP或者Cookie种子),你应该设置他的登录地点到新地点。所有的请求如果其地点与当前记录的登录地点不一致的,就结束并清空其session。这样才能保证用户有正常、合理的用户体验。 指望在一个地点登录后,关闭IE之后才能在其它地点访问是行不通的。你无法知道客户端在同一个Session下开了几个窗口,也不能保证客户一定关闭了这些窗口,甚至无法保证它关闭窗口的时候网络一定可用。所以建议你反转一下思路,看看我上一个帖子的建议。那样可以保证用户同时只能在一个地点登录但又不会失去随时改变地点的自由。欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。 加一张Online表 用来记录当前在线的用户,用XMLHTTP割30秒刷新一次最后在线时间,使其等于当前服务器时间-----------------------------很好资源,如果有几个窗口,几十个,再加上很大的在线用户,那是不可想像的,如果不考虑这情况,还是可以解决问题的要是采用互斥的办法,后登陆的把以前登陆的给他下线,这也不错 您也太敬业了,凌晨1点还在工作!!!--只是刚刚用WinForm赶完一个作业,然后上来看看。怎么楼上还有那么多人讨论要考虑浏览器关闭的情况,那时做不到的事情。能够做到的就是,如果存在第二个登录则第一个登录失效,而客户端什么时候结束某一次“会话”是无法确定的,这里的“会话”指客户眼里访问此网站一次的完整流程,而不是指Session。 再利用cookie的判断即可判断是否是同一台机器 好像在那里看过用临时表解决帐号登录的问题!不过是CS中,在BS中不知可行否! 探讨一下 asp.net 中下载“连接被重置”的问题 谁能提供些Mapxtreme2005 for .net的开发资料呢 |M| 如何将一段字符写入数组 谢谢在线 急 gridview 增加一列动态按纽.单击动态出现页. dataGrid里动态生成TextBox的问题 vs.net 使用问题 请各位高手帮我指点一下Web.Config的配置错误!谢谢! 是button还是textbox的问题。急啊!!!! 不能写数据库(3天了这个小问题没解决) 如何在datagrid中实现排序。 有无比较通用的分页类啊 ASP.NET中DataGrid显示问题?
http://dotnet.aspx.cc/article/CF5FFABC-CFE1-4368-3C13-9B4FCD7C7168/read.aspx
也可以放数据库
你的这个可能会出现问题,在同一台客户端,一个帐号登录后,又退出,然后又登录,你的cache没有清掉,反而不能登录了,用户退出后马上登录的可能性很大哦,如果能够区别出不是同一个客户端登录的就好了
SessionID,用户账号,最后访问时间然后判断“当前用户是否重复登录”的程序判断同一个用户账号是否已经在其它会话中登录(未超时),同时顺便把超时的记录删除掉(显然不删除也没有逻辑错误)。预先确定一下业务逻辑,是禁止重复登录还是后登录的用户把前边的“踢掉”,如果是后者还要多设计一点处理逻辑。
先判断Cache中是否有该用户存在, 存在的话, 则更新最近活动时间. 否则的话把当前用户Add到Cache中. 并更新数据库中的状态字段 标志用户已登陆后台用用Timer每5分钟检测一次缓存(具体看你的业务需求), 用当前时间 - Cache中的最近活动时间 如果大于某个特定的值 比如1分钟, 则更新数据库表的状态字段 标志用户已离线,并清除Session 或 Cookies我觉得可行. 大家觉得呢 讨论一下`
HttpContext.Current.Cache.Remove(Session[System.Configuration.ConfigurationSettings.AppSettings["connstr1"]].ToString());
Session.Abandon();
Session.Clear();
Response.Redirect("Login.aspx");
直接关闭浏览器<body onbeforeunload='window.location.href = "LoginOut.aspx";'>
if(HttpContext.Current.Session[System.Configuration.ConfigurationSettings.AppSettings["connstr1"]]!=null)
{
HttpContext.Current.Cache.Remove(HttpContext.Current.Session[System.Configuration.ConfigurationSettings.AppSettings["connstr1"]].ToString());
}
时间越长则节约资源,但是用户非正常退出重新登陆的时间越长
我想30秒大家都容易接受.
用条If语句就得了
session超时时就刷新网页重连数据库
判断用户IP就行了吗
同意asp600(剑气潇潇)的观点,我也是这样来实现的.
主要是关闭浏览器或非法关机(重启)之类得不到好的解决,有人说如果叉掉ie的关闭按钮,在事件onbeforeunload中向服务器发出请求来更改登陆信息,这样是可以解决,但用户登陆后可能开了好几个窗口,关掉一个,其他就用不了.非法关机没办法解决的关注,继续看讨论...
主要是关闭浏览器或非法关机(重启)之类得不到好的解决,有人说如果叉掉ie的关闭按钮,在事件onbeforeunload中向服务器发出请求来更改登陆信息,这样是可以解决,但用户登陆后可能开了好几个窗口,关掉一个,其他就用不了.非法关机没办法解决的关注,继续看讨论...
___________________________________________________________________
加一张Online表 用来记录当前在线的用户,用XMLHTTP割30秒刷新一次最后在线时间,使其等于当前服务器时间
——————————————————————————————这已经解决了关闭浏览器与非正常退出的问题了
1.用户登录,生成一个token(精确的DateTime或GUID之类的),然后保存到数据库和客户端Cookies。
2.用户浏览时,每次都是用Cookies的token和数据库的比较,确认是否为有效token。
3.一旦用户在别的地方登录,将颁发新的token,由于数据库中原来的token已经被新的覆盖,所以原来的登录自然失效。
正在做VIP的系统 学习
{
登陆.并将username写入session["UserName"]
}
else
{
同一账号已登陆。
}如果要使本机可以重新登陆的话。你就加个ip到session一样的判断。同理
{
登陆.并将username写入session["UserName"]
}
else
{
同一账号已登陆。
}
以前做asp聊天室时这么处理的。
呵呵 当某用名 登陆时 online为1
当同样的用户名登陆时 online已经为1 则不能登陆 永远只有一个用户可以用某一个用户名登陆!
欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
-----------------------------
很好资源,如果有几个窗口,几十个,再加上很大的在线用户,那是不可想像的,如果不考虑这情况,还是可以解决问题的要是采用互斥的办法,后登陆的把以前登陆的给他下线,这也不错
--
只是刚刚用WinForm赶完一个作业,然后上来看看。怎么楼上还有那么多人讨论要考虑浏览器关闭的情况,那时做不到的事情。能够做到的就是,如果存在第二个登录则第一个登录失效,而客户端什么时候结束某一次“会话”是无法确定的,这里的“会话”指客户眼里访问此网站一次的完整流程,而不是指Session。