欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2023-12-28 19:19:40
...

在登陆的时候,判断密码账号是否正确,正确的话分配一个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不同时,就会强制用户下线。

相关标签: asp.net

上一篇:

下一篇: