asp.net禁止重复登陆,强制下线

在登陆的时候,判断密码账号是否正确,正确的话分配一个Guid(全局标识符)给当前用户,并在全局变量中存储当前用户的Id和他的Guid。代码如下:

                        //保存登陆成功的令牌
                        string Guid_str = "";
                        //分配一个唯一标识符
                        Guid_str = Guid.NewGuid().ToString();
                        Response.Cookies["GUID"].Value = Guid_str;
                        //给系统变量存储一个值,Uid代表哪个用户,GUID则是唯一标识符
                        Application[user.Uid + "_GUID"] = Guid_str;
                        Session["Uid"] = user.Uid;

其中user.Uid就是当前用户的id。

然后创建一个一般处理程序。


using System;
using System.Web;
using System.Runtime.Serialization.Json;
using BLL;
using Model;
//注意:如果要用session的话需要继承接口,并且引入SessionState命名空间
using System.Web.SessionState;
public class RepeatLogin : IHttpHandler,IRequiresSessionState{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        //全局变量
        HttpApplicationState applicationState = HttpContext.Current.Application;
        string message = "";
        string Uid = "";
        //判断Session是否还有效
        if (context.Session["Uid"] == null)
        {
            message = "登陆信息以失效";
        }
        else
        {
            //获取session里面的用户id
            Uid = context.Session["Uid"].ToString();
            //判断是否过期
            if (context.Request.Cookies["GUID"] != null && applicationState[Uid + "_GUID"] != null)
            {
                //判断用户是否重复登陆
                if (applicationState[Uid + "_GUID"].ToString() != context.Request.Cookies["GUID"].Value)
                {
                    message = "已登陆";
                }
            }
            //判断用户的状态
            if (new UserManager().GetUsers_ByUid(context.Session["Uid"].ToString()).States == 1)
            {
                message = "已冻结";
            }
        }
        //返回
        DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(string));
        ds.WriteObject(context.Response.OutputStream, message);
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

创建一个js函数

 //禁止重复登陆
    function RepeatLogin() {
        $.getJSON("../Handlers/RepeatLogin.ashx", function (data) {
            if (data == "已登陆") {
                alert('此用户已在别处登陆!你被强制下线!');
                window.location.href = '../Login.aspx';
            }
            if (data == "已冻结") {
                alert('你的账号刚刚被冻结!');
                window.location.href = '../Login.aspx';
            }
            if (data == "登陆信息以失效") {
                alert('身份信息以失效,请重新登陆!');
                window.location.href = '../Login.aspx';
            }
        })
    },

然后再你需要判断的页面进行js操作

%(function(){
    //马上开始执行
   RepeatLogin();
    //每隔一秒执行一次
   setInterval(RepeatLogin,1000);
})

当用户没有重复登陆时,系统分配一个guid给用户,并记录用户id和对应的guid,这个用户在线时系统变量存储的用户id以及对应的guid值是不会变的,这时候有另外一个人用相同的账号登陆时,会改变系统变量中用户id对应的guid,这时候一般处理程序就判断出系统变量存储的guid与用户cookie存储的guid不同时,就会强制用户下线。

猜你喜欢

转载自blog.csdn.net/qq_41987694/article/details/81095475
今日推荐