原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html

实现原理:在服务器端记录登录的用户id+sessionid,当重复登录时,根据用户id用新的sessionid替换掉旧的sessionid,在需要单用户登录的操作时就可以判断sessionid是否匹配,不匹配则证明有其他人登录了你的账户,这时可要求重新登录或其他的操作。

实现步骤:1、登录时记录登录的用户id+sessionid,可利用application、cache、数据库等。

     2、写一个过滤器用于判断当前的用户id和sessionid跟服务器记录的是否匹配以及不匹配时进行的操作。

       3、在session过期或者退出系统时释放资源。

步骤1:

        private void getonline(string name)
        {
            hashtable singleonline = (hashtable)system.web.httpcontext.current.application[“online”];
            if (singleonline == null)
                singleonline = new hashtable();

            session[“mysession”] = “test”;
            //sessionid
            if (singleonline.containskey(name))
            {
                singleonline[name] = session.sessionid;
            }
            else
                singleonline.add(name,session.sessionid);

            system.web.httpcontext.current.application.lock();
            system.web.httpcontext.current.application[“online”] = singleonline;
            system.web.httpcontext.current.application.unlock();
        }

说明:登录时将用户名(唯一标识符即可)传给该方法,该方法实现记录用户id以及sessionid

 

步骤2:

  public class loginactionfilter : actionfilterattribute
    {
        public override void onactionexecuting(actionexecutingcontext filtercontext)
        {
            hashtable singleonline = (hashtable)filtercontext.httpcontext.application[“online”];
            // 判断当前sessionid是否存在
            if (singleonline != null && singleonline.containskey(filtercontext.httpcontext.user.identity.name))
            {
                if (!singleonline[filtercontext.httpcontext.user.identity.name].equals(filtercontext.httpcontext.session.sessionid))
                {
                    filtercontext.result = new contentresult() { content = “<script>if(confirm(‘你的账号已在别处登陆,是否返回登陆页面重新登陆?’)){window.location.href=’/authentication/login’;}else{window.close();}</script>” };
                }
            }
            base.onactionexecuting(filtercontext);
        }
    }
说明:该过滤器用于判断是否存在重复登录的情况,过滤器怎么用这里就不多说了,若存在重复登录,则执行if语句内的处理方式,这里的处理方式是弹出个确认框,当然你也可以直接跳转到登录地址,看需要更改。

 

步骤3:

        protected void session_end()
        {
            hashtable singleonline = (hashtable)system.web.httpcontext.current.application[“online”];
            if (singleonline != null && singleonline[user.identity.name] != null)
            {
                singleonline.remove(session.sessionid);
                system.web.httpcontext.current.application.lock();
                system.web.httpcontext.current.application[“online”] = singleonline;
                system.web.httpcontext.current.application.unlock();
            }
            session.abandon();
        }

说明:用于释放资源,该方法放置在global.asax里面。