Joffre's tech weblog

持而盈之 不如其已

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  18 随笔 :: 27 文章 :: 61 评论 :: 5 引用

需求概要
对于B/S应用系统中客户经常会提出同一帐号不能重复登录的需求,就是说,用某一帐号登录系统后,在系统不超时的情况下,任何人都不能再用目前已登录的帐号登录系统。包括我目前的项目中同样有这一需求。

其实要实现这个功能也不难,方法也有多种,比如用数据库来记录用户登录情况、用Application来保存用户登录信息、用Cache来保存信息等等。现在我们就来讨论一下如何利用缓存Cache方便地实现此功能。

解决方法
我们都知道Cache与Session这二个状态对像的其中有一个不同之处,Cache是一个全局对象,作用的范围是整个应用程序,所有用户;而Session是一个用户会话对象,是局部对象,用于保存单个用户的信息。

我们只要把每次用户登录后的用户信息存储在Cache中,把Cache的Key名设为用户的登录名,Cache的过期时间设置为Session的超时时间,在用户每次登录的时候去判断一下Cache[用户名]是否有值,如果没有值,证明该用户没有登录,否则该用户已登录。具体实现请看下例:

        private void Button1_Click(object sender, System.EventArgs e)
        
{

                
string strUser=string.Empty;
                
string strCacheKey = this.TextBox1.Text;

                strUser 
= Convert.ToString(Cache[strCacheKey]);

                
if(strUser == string.Empty)
                
{
                    TimeSpan SessTimeOut 
= new TimeSpan(0,0,System.Web.HttpContext.Current.Session.Timeout,0,0);

                    Cache.Insert(strCacheKey,strCacheKey,
null,DateTime.MaxValue,SessTimeOut,CacheItemPriority.NotRemovable,null);
                    Session[
"User"= strCacheKey;
                    
this.Label1.Text = Session["User"].ToString();
                }

                
else
                
{
                    
this.Label1.Text = "这个用户已经登录!";
                }

        



        }
posted on 2005-03-26 20:30 Joffre 阅读(2497) 评论(15)  编辑 收藏 网摘 所属分类: .NET

评论

#1楼  2005-03-27 17:00 jhtchina      
学习
  回复  引用  查看    

#2楼  2005-03-28 00:08 Addie      
在这个方案中,CacheItemPriority.Default 这个值的设置有问题,因为在Timeout之前,Cache也许已经被.Net释放掉了,此时虽然用户依然在线,但另一个用户也可以登录进来。
比较合适的设置应该是NotRemovable,这样可以确保在超时之前,Cache不会被释放。负面的影响就是内存消耗会大一些。
  回复  引用  查看    

#3楼  2005-03-28 09:07 Hanks [未注册用户]
To:Addied
你说确实没错,应该把CacheItemPriority.NotRemovable,要确保Cache的有效期为Session的过期时间。
十分感谢您的指正。
  回复  引用    

#4楼  2006-03-14 09:59 guest [未注册用户]
请教一个问题:如果同一用户名密码错误的情况下连续输入两次相同的错误密码会提示“这个用户已经登录”。
  回复  引用    

#5楼 [楼主] 2006-03-16 13:08 Hanks      
TO 楼上:

不是很明白您的意思,如果这个用户密码错误那就是没有登录,应该就不会提示“这个用户已经登录”。
  回复  引用  查看    

#6楼  2006-03-21 09:19 guest [未注册用户]
strCacheKey = this.TextBox1.Text;
因为你把key值设为用户名,所以不论密码错误与否,程序检测到的strCacheKey值都是一样的。那么如果用户连续两次输入错误密码不就出弹出“这个用户已经登陆”的提示吗?
  回复  引用    

#7楼  2006-05-23 14:43 新东 [未注册用户]
这样子做感觉有一个问题,就是当我们直接关闭浏览器时,如果Cache还没有超时的话,当我们再次登录时,就无法通过。只有等到Cache超时时才可以登录。不知道楼主对于这个问题是如何解决的呢
  回复  引用    

可以防止不同机器同时登录吗?
  回复  引用    

#9楼  2006-08-28 11:03 Nina      
@新东
我剛才測試的時候也遇到和你同樣的問題。不知道在瀏覽器關閉的時候如何來確保cache也同時清空該值。
  回复  引用  查看    

#10楼  2007-02-08 16:18 themax [未注册用户]
异常退出时怎么解决???
  回复  引用    

#11楼  2007-05-09 08:54 夕颜 [未注册用户]
关注中····
  回复  引用    

#12楼  2007-07-20 08:16 masha [未注册用户]
@新东
是啊,我也碰到这个问题了,有没有好的办法去解决呢
  回复  引用    

#13楼  2008-06-23 06:44 段传杰 [未注册用户]
解决不能重复登录
  回复  引用    

#14楼  2008-07-03 20:48 xpthink [未注册用户]
异常退出怎么解决呢?
如何获取到异常退出的信息呢?
  回复  引用    

#15楼  2008-10-14 10:13 reof [未注册用户]
异常退出时怎么解决。。异常退出但是Session的过期时间还未到(还有效)。那样同一用户名应该是可以登陆的。但是照LZ的意思。是不能登陆的,,着不符合逻辑。。请问该怎么解决!
  回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-03-28 09:13 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: