zoukankan      html  css  js  c++  java
  • ASP.NET MVC 解决账号重复登录问题

    解决重复登录 用到了 .net 身份票证 和Global全局处理文件 

    第一步 登录方法  传入用户名

    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);
    
    
    var httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName);
    var Expires = DateTime.Now.AddMinutes(30);
    httpCookie.Expires = Expires;
    httpCookie.Value = FormsAuthentication.Encrypt(new FormsAuthenticationTicket(0, Name, DateTime.Now, Expires, false, Name));
    HttpContext.Response.Cookies.Add(httpCookie);
    
    
    System.Web.HttpContext.Current.Application.Lock();
    System.Web.HttpContext.Current.Application["Online"] = SingleOnline;
    System.Web.HttpContext.Current.Application.UnLock();
    }
    

      

    第二步  配置添加票证 和web.config

    var httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName);
    var Expires = DateTime.Now.AddMinutes(30);
    httpCookie.Expires = Expires;
    httpCookie.Value = FormsAuthentication.Encrypt(new FormsAuthenticationTicket(0, Name, DateTime.Now, Expires, false, Name));
    HttpContext.Response.Cookies.Add(httpCookie);
    

      

    身份票证可以放到底层封装起来 用于存储用用户名和票证信息 

    添加完票证信息后 可能会出现User.Identity.Name 无法获取到值的问题,这个时候  就说明你web.config中未配置相应的参数

    配置如下 在 <system.web>节点下配置 如下即可

    <authentication mode="Forms">
    <forms loginUrl="/" timeout="30" />
    </authentication>
    <authorization>
    <allow users="*" />
    </authorization>
    

      

    第三步 新建一个类配置mvc的过滤类

    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='/';}else{window.close();}</script>" };
    }
    }
    base.OnActionExecuting(filterContext);
    }
    }
    

      

    将这串代码引入你的过滤类中即可 然后就OK了 该过滤器用于判断是否存在重复登录的情况,过滤器怎么用这里就不多说了,若存在重复登录,则执行if语句内的处理方式,这里的处理方式是弹出个确认框,当然你也可以直接跳转到登录地址,看需要更改。

     第四步 就是解决 资源释放问题 将如下代码放入 Global.asax 全局配置文件中

    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();
    }
    

      

  • 相关阅读:
    指定的参数已超出有效值的范围。参数名:sit ,先仔细看看错误和我的一样不一样
    简单说下C#变量的作用域
    C#常用的字符串处理方法
    驼峰命名、帕斯卡命名、匈牙利命名--三种命名方法
    Python的安装
    Python下numpy的使用
    命名法:骆驼(Camel)、帕斯卡(pascal)、匈牙利(Hungarian)、下划线(_)
    PHP中高级面试问题集锦
    利用python,生成word
    python实现网页截图
  • 原文地址:https://www.cnblogs.com/cenwenlin/p/9105143.html
Copyright © 2011-2022 走看看