zoukankan      html  css  js  c++  java
  • 同一账号不能同时登陆

    对于登陆权限控制问题,我认为Session,Cache,Application都可以

    Asp.net中防止用户重复登录一:这种情况用到了Session,此情况适应于单一账户登陆

    Ajax调用

    View Code
    string strUserId = txtName.Text.ToString();
    //将Session转换为Arraylist数组
    ArrayList list = Session["GLOBAL_USER_LIST"] as ArrayList;
    if (list ==null)
    {
    list
    =new ArrayList();
    }
    for (int i =0; i < list.Count; i++)
    {
    if (strUserId == (list[i] asstring))
    {
    //已经登录了,提示错误信息
    Response.Write("<script>alert('该用户已经登录,不允许重复登录')</script>");
    return;
    }
    }
    //将用户信息添加到list数组中
    list.Add(strUserId);
    //将数组放入Session
    Session.Add("GLOBAL_USER_LIST", list);

    这样就将用户登陆信息保存到Session里面

    但是这样的话用户一旦登陆,第二次就永远无法在登陆了;

    所以就要考虑用户是否过期,还有ie非正常关闭,电脑死机等问题

    在Web.config中添加如下代码:

    //设置超时为1分钟
    <sessionState mode="InProc" timeout="1"></sessionState>

    在建立一个轮训页面,用ajax定时get次页面以不断更新session值

    test.aspx页面就是一个空页面,只不过需要在Page_Load中加入:

      Response.Expires =-1;

    在每个页面中加入如下的javascript(这些javascript也可以写在共通里,每个页面引入就可以了)

     var x=0;
      function myRefresh()
      {
      var httpRequest
    =new ActiveXObject("microsoft.xmlhttp");
      httpRequest.open(
    "GET", "test.aspx", false);
      httpRequest.send(
    null);
      x
    ++;
      
    if(x<60) //60次,也就是Session真正的过期时间是30分钟
      {
      setTimeout(
    "myRefresh()",30*1000); //30秒
      }
      }
      myRefresh();

    这样就实现了单点登陆的控制

    ===============================================================================

    Asp.net中防止用户重复登录二:Application方法,本人推荐此方法

    这种方法是:将用户名和时间以数组形式存入Application里面,在再Ajax轮询页面定时判断当时时间和登陆存入时间的差值;假设差值为1分钟就认为过期

    所以当差值大于1分钟时就将Application里面的用户名移除,Ajax默认30秒轮询一次text状态页面,如果没有过期则将时间更新,

    当页面非正常退出或者电脑死机时上次登陆时间没变,所以下次登陆是首先ajax轮询状态页面,如果掉线时间超过默认过期时间,则将application移除,则登陆成功

    在登陆button里面写入如下代码

    在Arraylist数组里面的值是以“;”分隔的,如admin;2010-01-01 12:00:00

    View Code
    string username1 = txtName.Text.ToString();
    ArrayList list
    = Application.Get("GLOBAL_USER_LIST") as ArrayList;
    if (list ==null)
    {
    list
    =new ArrayList();
    }
    for (int i =0; i < list.Count; i++)
    {
    string userskey = list[i].ToString();
    string usernames = userskey.Substring(0, userskey.IndexOf(";"));
    if (username1 == usernames)
    {
    //已经登录了,提示错误信息
    Response.Write("<script>alert('该用户已经登录,不允许重复登录')</script>");
    return;
    }
    }
    string Time = DateTime.Now.ToLocalTime().ToString();
    string userkey = username1 +";"+ Time;
    list.Add(userkey);
    Application.Add(
    "GLOBAL_USER_LIST", list);

    状态页面text.aspx页面:

    View Code
    publicpartialclass test : System.Web.UI.Page
    {
    protectedvoid Page_Load(object sender, EventArgs e)
    {
    //获取Application,并将其转换为Arraylist数组默认数组存值为admin;2010-01-01 12:00:00
    ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;
    //获取本地时间
    DateTime Times = DateTime.Now.ToLocalTime();
    if (list !=null)
    {
    for (int i =0; i < list.Count; i++)
    {
    string userskey = list[i].ToString();
    //获取时间
    string time = userskey.Substring(userskey.IndexOf(";") +1);
    //获取用户名
    string username = userskey.Substring(0, userskey.IndexOf(";")+1);

    DateTime Time
    = Convert.ToDateTime(time);
    //判断时间是否过期
    bool s = GetTime(Time);
    if (s)
    {
    //如果时间过期则移除用户信息
    list.RemoveAt(i);
    Response.Redirect(
    "login.aspx");
    }
    else
    {
    //否则将用户信息,时间更新,
    list.RemoveAt(i);
    string Time2 = DateTime.Now.ToLongTimeString();
    list.Add(username
    + Time2);
    }

    }
    }
    }
    ///<summary>
    /// 判断时间是否过期
    ///</summary>
    ///<param name="Time">上次轮询或者登陆时间</param>
    ///<returns></returns>
    publicstaticbool GetTime(DateTime Time)
    {
    DateTime TimeNow
    = DateTime.Now.ToLocalTime();
    DateTime Time2
    = Convert.ToDateTime(Time);
    TimeSpan type
    = TimeNow - Time2;

    bool sa =false;
    if (Convert.ToDateTime(type.Hours +":"+ type.Minutes +":"+ type.Seconds) > Convert.ToDateTime("00:01:00"))
    {
    sa
    =true;
    }
    return sa;
    }
    }
    var x =0;
    function myRefresh() {

    var httpRequest
    =new ActiveXObject("microsoft.xmlhttp");
    httpRequest.open(
    "GET", "test.aspx", false);
    httpRequest.send(
    null);
    x
    ++;
    if (x <60) //60次,也就是Session真正的过期时间是30分钟
    {
    setTimeout(
    "myRefresh()", 30*1000); //30秒
    }
    }
    myRefresh();
  • 相关阅读:
    C语言源代码——计算任何一天是星期几
    计算任意一天是星期几
    wpf利用线程制作初始界面和关闭窗体特效
    实用的 集合工具类 和 String工具类
    从“关于Java堆与栈的思考”一帖看错误信息的传播
    web.xml 配置中classpath: 与classpath*:的区别
    git的安装-环境变量配置
    解决Oracle安装时报错“SID已在使用”办法
    ORACLE日期时间函数
    Java 开发环境配置
  • 原文地址:https://www.cnblogs.com/happygx/p/2043520.html
Copyright © 2011-2022 走看看