asp.net中用户唯一在线的经典解决方案

大家开发中可能都碰到的一个问题,怎么使同一个用户,在同一时间内只允许登录一次。

很多人都会想到在数据库中用一个标识字段,登录进去置1,退出置0,登录时判断这个字段,如果是1就说明此用户在线,不允许登录,这个方案看似有效,但在实际使用中发现问题很多,比如,用户不是通过程序中的退出按纽退出,而是直接关闭IE,这样的话,下次登录时数据库里此用户还在线呢,这个用户就无法登录,当然也有一些办法可以解决这个问题:增加一个定时作业,定期复位那些长时间在线的用户,这样又会造成一些问题,如果这个用户实际上就是使用了这么长时间,那就是误杀。

通过多次实验,发现.net本身可以提供这种解决方案。步骤如下:

第一:建立global.asax文件, Session_End 事件中写入如下代码:

           Hashtable h = (Hashtable)Application["online"];
           if (h[Session.SessionID] != null)
               h.Remove(Session.SessionID);
           Application["online"] = h;

第二:修改web.config文件,在system.web 结点里面增加

<sessionState mode="InProc"></sessionState>

这个是为了使用global.asax中的session_end事件生效。

第三:页面的登录事件中,判断登录用户是否在服务端全局变量中存在,存在就不允许登录,不存在就创建。以下是实现过程,放在登录按纽的事件中。

public void isLogin()
       {
           Hashtable h = (Hashtable)Application["online"];
           if (h != null)
           {
               //验证用户是否在Application中存在(是否在线)
               IDictionaryEnumerator e1 = h.GetEnumerator();
               bool flag = false;
               while (e1.MoveNext())
               {
                   if (e1.Value.ToString() == this.txt_user_id.Text.Trim())
                   {
                       flag = true;
                       break;
                   }
               }
               if (flag)
               {
                   Response.Write("<script defer language='javascript'>alert('This user is online!');history.go(-1);</script>");
                   Response.End();
               }
           }
           else
               h = new Hashtable();


           h[Session.SessionID] = this.txt_user_id.Text.Trim();
           Application["Online"] = h;
       }

注意:在VS2005的内置WEB服务器中测试可能有问题,还在放在IIS的正式环境中去测试.

关于此方案的说明:一般情况下session 的timeout时间为20分钟,也就是说,如果这个用户直接关掉浏览器,然后马上再登录,这个时间session还没有到期,所有不会触发global.asax中的session_end事件,所以会提示这个用户还在线,20分钟后这个事件执行过后,会删掉这个不活动的用户,这时候再登录就正常了。所以不要认为直接关掉IE后,再登录进不去了,就认为这个方案无效。

当然,session 的timeout 时间可以修改的,20分钟不合适可以改。改法如下:

<sessionState mode="InProc" timeout="你认为合适的值"></sessionState>

 

一、 需求分析 随着人事考核制度的逐渐科学化、规范化、日常化,组织机构越来越多地要求能够对被考核侯选人实行全面的考核,其,考核候选人周围的同事、领导及其被管理的员工对候选人的评价(所谓360度考核)是一个重要的参考依据。 但是,针对不同的员工组织可能采用不同的考核标准,同时,作为组织的一员,所有的员工都有可能成为被考核候选人。并且,对员工的360度考核可能会有大量的数据,举例说,如某公司有员工1000人,现希望给10个被考评候选人进行测评打分,每个候选人需要考评10项内容,如此,将会产生10万条数据,这显然是巨大的,并且对数据的处理将是费时费力的,当将考核制度日常化之后,如果不能采用有效的考核手段,这种对时间、人员精力的占用将会是相当巨大的。 另一个方面,考虑到员工集对侯选测评人进行打分时,可能会因为种种顾虑,而有失公允,故,应能将系统开发成基于Internet网络的在线测评系统。 二、开发工具及数据库管理系统 主要基于Internet技术同时兼顾Window应用来实现软件的创建、部署、使用的.net框架是微软21世纪主推的开发平台,并且,也是微软下一代操作系统策略的核心。 相比于JAVA是一个标准,.Net是一个架构,它包含了在操作系统上开发软件的所有层次,为集成任意平台上的显示技术、组件技术、数据驱动技术提供了丰富的层次。.net实际上封装了操作系统的部分功能,如文件处理和内存分配,这就为软件的移植奠定了良好的基础。 .net总体分为三层体系结构,底层是公共语言运行库(CLR),它是.net的核心,是驱动关键功能的引擎,它包括数据类型的公共系统,这些公共标准和标准接口约定使跨语言继承成为可能,除了内存的分配和管理之外,CLR还负责对象的跟踪、垃圾回收等。间层包括一些重要的系统服务,如ADO.Net,XML类,组件模型,安全性等,这些服务在总架构的控制之下,可以在各处通用,而且调用方式与语言无关。顶层主要提供给程序开发者开发Window窗体和WEB表单,WEB服务、应用服务。其WEB服务为程序使用SOAP在Internet上通信提供了一种机制,这也是未来网络信息处理的一个主要方向。 综观.net体系,它在软件项目开发具有以下一些值得关注的优点。 1) 语言集成。可以使程序人员真正实现跨语言编程,而且相当多对下层对象的调用方法是统一的,且所有.Net支持的语言都被编译为标准的字节代码,所以语言之间的性能和差异变小了。因而,使用什么语言编程已不是重要问题。 2) 与数据库特别SQL_server数据库良好接口,以及在Internet下编程的突破,使得开发WEB下的管理信息系统更加容易。 3) 提供对WEB服务的支持,且平台自动完成WEB服务的建设,隐藏了SOAP 、WSDL 、XML的复杂性。 4)CLR集成了内存和过程的管理从而实现了系统的可伸缩性,而绝大多数系统的功能都集在CLR,因此,不需要再付出任何代价,即可获得应用程序的较大伸缩性。 5)秉承了微软的一贯作风:一个良好的IDE环境,即使开发人员可能需要适当地手工编写代码,但集成的开发环境为项目开发、调试、部署都带来了极大的方便。 数据库管理系统选用SQL_server2000,SQL_server2000是Microsoft推出的高性能关系数据库管理系统,是Microsoft公司在大型数据库领域的最新版本和旗舰产品,也是Microsoft公司争夺电子商务领域最重要的核心部件市场——网络数据库平台的一大利器。 SQL_server2000是建立在SQL_server6.5和7.0坚固而雄厚的技术基础之上,是公论的运行在Window平台的最佳数据库。SQL_server2000已经在性能和可扩展性方面建立了世界领先的地位,是一套完全的数据库和数据分析解决方案。 另一方面,作为Microsoft公司的同一家公司的两个不同领域的产品,.net与SQL_server2000具有及其良好的接口,Ado.net很多的数据库访问对象是专门针对SQL_server2000进行开发的,对SQL_server2000有极好的操控性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值