限制同一个用户在同一时间只能登陆一次(转)

1.首先是如何激发Session_End()方法
因为这个方法只支持InProc(进程内的)类型的Session,所以我们将Web.config配置如下:
<sessionState timeout="1" mode="InProc"> </sessionState>

2、Global.asax中的Application_Start定义全局对象:

C# code?





1

2

3

4

5

6

7

    void Application_Start(object sender, EventArgs e) 

    {

        // 在应用程序启动时运行的代码

        //定义菜单对象

        System.Data.DataTable _myMenu=null;

       System.Collections.ArrayList _onlineUser = null;

    }

3、在用户页面写用户登陆的Session["userName"] 以及把这个Session["userName"] 给全局变量:Application["_onlineUser"]

C# code?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

        Session["userName"] = this.TxtB_UserName.Text.Trim();

        //存用户ID到全局变量_onlineUser中去

        Application.Lock();

        if (Application["_onlineUser"] == null)

        {

            ArrayList _myUser = new ArrayList();

            _myUser.Add(Session["userName"]);

            Application["_onlineUser"] = _myUser;

        }

        else

        {

            //判断用户是否存在,不存在则添加到全局变量 Application["_onlineUser"] 中去

            if (!((ArrayList)Application["_onlineUser"]).Contains(Session["userName"]))

            {

                ((ArrayList)Application["_onlineUser"]).Add(Session["userName"]);

            }

            else { Response.Write("<script>alert(‘该用户已登陆,您无法登陆!‘);</script>"); }

        }

        Application.UnLock();

        //显示一下当前在线用户(即Application["_onlineUser"]的所有内容)

        for (int i = 0; i < ((ArrayList)Application["_onlineUser"]).Count; i++)

        {

            Response.Write("<script>alert(‘" + ((ArrayList)Application["_onlineUser"])[i].ToString() + "‘);</script>");

        }

4、再到Global.asax 中的Session_End里面写用户退出代码:

C# code?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

    void Session_End(object sender, EventArgs e) 

    {

        // 在会话结束时运行的代码。 

        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为

        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 

        // 或 SQLServer,则不会引发该事件。

        Application.Lock();

        try

        {

            //把用户从全局变量 _onlineUser 中删除

            ((ArrayList)Application["_onlineUser"]).Remove(Session["userName"]);

        }

        catch (Exception ex)

        { }

        Application.UnLock();

    }

注意:

(1)在会话开始和结束时,一定要进行加锁和解锁操作。由于多个用户可以共享Application对象,因此加锁是必要的,这样可以保证在同一时刻只有一个客户可以修改和存取Application对象的属性。如果加锁后,迟迟不给开锁,会导致用户无法访问Application对象。我们可以使用对象的Unlock方法来解除锁定。

(2)我们是根据用户建立和退出会话来实现在线人数的增加、减少的,如果用户没有关闭浏览器,而直接进入其他URL,则这个会话在一定时间内是不会结束的,所以对在线用户的统计存在一定的偏差。当然我们可以在Web.config文件中对会话Session的失效时间Timeout来设置,默认值为20分钟,最小值为1分钟。

(3)只有在Web.config文件中的sessionstate模式设置为InProc时,才会引发Session_End事件。如果会话模式为StateServer或SQLServer,则不会引发该事件。

原文:http://bbs.csdn.net/topics/230049812

时间: 2024-10-25 15:40:18

限制同一个用户在同一时间只能登陆一次(转)的相关文章

web站点,同一个浏览器只能登陆一个用户的原因(cookie不能跨浏览器)

我的web站点,比如  http://ip/testsite/default.aspx, 当我在我的机器上,用chrome打开,用账号user1登陆,那么当我再新开个tab,再打开这个web站点,这时显示的还是user1登陆着.我想在chrome里面用另一个账号user2登陆,那么只能是退出user1,再用user2登陆.也就是在同一个浏览器里,同一时间只能一个账号登陆. 而同一时间,在不同的浏览器里,比如一个是chrome, 一个是firefox,分别用user1和user2登陆,这样是可行的

[asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的

一.感慨 很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话:特别最近发现非常一个成熟的项目中有些问题非常非常影响性能,最终影响的是用户体验,借此给大家分享一下关于asp.net中一个小小的点,但对项目有很大的性能提升:以前觉得自己接触的项目少小,然后接触的项目越多,越大就会越发现,同样的问题依旧存在: 二.先从最简单的asp.net mvc例子说起 1.Co

通过SessionID和用户名来保证同一个用户不能同时登录

转自http://blog.csdn.net/cctcc/article/details/9773185 可以通过SessionID和用户名来保证同一个用户不能同时登录的问题,下面程序模仿了QQ的登录,当登录后判断当前帐号是否已经登录,如果登录.则踢掉以前登录的用户. 1.通过Application全局变量来存储SessionID和用户名,每次登录时都保存,并且将该Application存入 Hashtable中,当用户登录成功后,首先判断该用户是否已经存储在Application中,如果存在(

Linux如何找出用户的创建时间

在Linux系统中,如何找到用户创建的时间呢? 其实是没有标准方法查找用户创建时间.下面再搜索了一些资料后,自己验证并测试了一下这些方法,仅供参考: 1:如果创建的用户有家目录,那么可以ls -l /home/<username>/.bash_logout 来找到用户的创建时间. [[email protected] ~]# cat /etc/shadow | grep test test:$1$WL5jXsvt$bJqebY44KjmhaLjaFkB1f/:16972:0:99999:7::

查看用户登录信息并统计登陆的次数

一.查看用户登录信息的命令 1.    w                查看当前系统上登录的所有用户的信息 2.    who            查看该shell终端下登录用户的详细信息 3.    whoami      查看本shell终端下登陆的用户 4.    last            查看历史的所有登录信息 [[email protected]_server workspace]# w  14:59:23 up 19 days,  5:35,  1 user,  load 

Oracle同一个用户下启动多个数据库实例

[email protected] oradata]$ export ORACLE_SID=APPDB[[email protected] oradata]$ lsnrctl startLSNRCTL for Linux: Version 11.2.0.4.0 - Production on 22-MAY-2014 11:42:15Copyright (c) 1991, 2013, Oracle.  All rights reserved.TNS-01106: Listener using li

提示用户输入一个时间的秒数,比如500秒就输入500,然后输出对应的分钟和秒,比如500s就是8分钟20秒

#include <stdio.h> /* */ int main() { /* // 将c的值固定在10以内 int a = 96546546; int c = a % 10; */ // 1.提示用户输入时间 printf("请输入一个时间值(秒):\n"); // 2.接收用户输入的时间 int time; scanf("%d", &time); // 3.转换成对应的分钟和秒 int minute = time / 60; // 分钟 i

如何设置ssh安全只允许用户从指定的IP登陆

原文链接: 如何设置ssh安全只允许用户从指定的IP登陆 由于开发上传文件需要  在服务器上开启  允许用户名和密码ssh登录.这样不太安全.百度后参考文章现在ssh用户名和密码登录的ip. 登录服务:首先 cat /etc/passwd 查看哪些用户可以登录: [[email protected] webuser]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x

新建一个用户,让他只能看到某一个视图(View),如何设置

新建一个用户,让他只能看到某一个视图(View),怎么设置? 新建一个用户,让他只能看到某一个视图(View),怎么设置? 如果做不到“只能看到指定视图”,最好能做到“对指定表或视图只有查询的权限”. 谢谢!------解决思路----------------------在指定权限时只对视图授权 USE [master] GO CREATE LOGIN [Test] WITH PASSWORD=N'1', DEFAULT_DATABASE=[DB], CHECK_EXPIRATION=OFF,