zoukankan      html  css  js  c++  java
  • [原创]利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆(修改)

    /*
    作者:阿牛(牛昆亮) QQ:273352165 MSN:niukl@hotmail.com

    声明:可以免费使用,请您保留此信息
        如果您有什么改过,记得告诉我!
    */


    我在们使用ASP.Net开发WEB网站时,有的时候是不让同一个用户名在同一时间进行多次登陆的。
          为了不影响原来的整个网站,我选择使用了HttpModuler来实现。

          先让所有的Page从自己的Page类:BasePage类继承,并实现 ISigleLogin接口。相关代码如下:

        public interface ISingleLogin
        
    {
            
    string SigleUserLoginId get; }

            
    void SigleUserLogout();

        }

    public class BasePage : System.Web.UI.Page , BNet.Web.Modulers.ISingleLogin
    {
        
    public BasePage()
        
    {
            
    //
            
    // TODO: 在此处添加构造函数逻辑
            
    //
        }


        
    protected override void OnLoad(EventArgs e)
        
    {
            
    base.OnLoad(e);
            
    if (Session["UserId"== null)
            
    {
                Response.Write(
    "你还没有登陆");
                Response.Redirect(
    "login.aspx");
            }

        }


        
    ISingleLogin 成员
    }

          然后在Web.config中加入HttpModuler:

    <system.web>
        
    <httpModules>
          
    <add name="SingleLogin" type="BNet.Web.Modulers.SingleLoginModuler"/>

        
    </httpModules>
    </system.web>

          相关的SigleLoginModuler代码如下:[依评论修改后]

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.UI;

    namespace BNet.Web.Modulers
    {
        
    /// <summary>
        
    /// SingleLoginModuler 的摘要说明
        
    /// </summary>

        public class SingleLoginModuler : System.Web.IHttpModule
        
    {
            
    const string sigle_login_userid = "evlon_siglelogin_userid";
            
    const string sigle_pre_logout_sessionid = "evlon_sigle_pre_logout_sessionid";

            
    public static StringLifeValueDictionary UsableGetter(ref StringLifeValueDictionary dic)
            
    {
                
    if (dic == null)
                
    {
                    dic 
    = new StringLifeValueDictionary();
                }

                
    else
                
    {
                    List
    <string> listRemove = new List<string>();
                    StringLifeValueDictionary.Enumerator iter 
    = dic.GetEnumerator();
                    
    while (iter.MoveNext())
                    
    {
                        
    if (iter.Current.Value.life < DateTime.Now)
                        
    {
                            listRemove.Add(iter.Current.Key);
                        }

                    }


                    
    foreach (string key in listRemove)
                    
    {
                        dic.Remove(key);
                    }

                }


                
    return dic;
            }


            
    static StringLifeValueDictionary loginedUserIdDictionary = null;
            
    static StringLifeValueDictionary LoginedUserIdDictionary
            
    {
                
    get
                
    {
                    
    return UsableGetter(ref loginedUserIdDictionary);
                }

            }


            
    static StringLifeValueDictionary preLogoutSessionIdDictionary = null;
            
    static StringLifeValueDictionary PreLogoutSessionIdDictionary
            
    {
                
    get
                
    {
                    
    return UsableGetter(ref preLogoutSessionIdDictionary);
                }

            }


            
    public SingleLoginModuler()
            
    {
                
    //
                
    // TODO: 在此处添加构造函数逻辑
                
    //
            }


            
    IHttpModule 成员
        }


        
    public class LifeValue
        
    {
            
    public string value;
            
    public DateTime life;

            
    public LifeValue(string value)
            
    {
                
    this.value = value;
                
    this.life = DateTime.Now.AddMinutes(HttpContext.Current.Session.Timeout + 5);
            }

        }


        
    public class StringLifeValueDictionary : Dictionary<string, LifeValue>
        
    {

        }



        
    public interface ISingleLogin
        
    {
            
    string SigleUserLoginId get; }

            
    void SigleUserLogout();

        }

    }


         如此,只在在你自己的BasePage中改动相关的代码(只两三行)就可以实现功能了。

    QQ:273352165 evlon#126.com 转载请注明出处。
  • 相关阅读:
    XML错误信息Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-4.0.xsd). For more information, right click on the message in the Problems View ...
    Description Resource Path Location Type Cannot change version of project facet Dynamic Web Module to 2.3.
    maven创建web报错Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-compiler-plugin:maven-compiler-plugin:3.5.1:runtime Cause: error in opening zip file
    AJAX跨域
    JavaWeb学习总结(转载)
    JDBC学习笔记
    Java动态代理之JDK实现和CGlib实现
    (转)看懂UML类图
    spring boot配置使用fastjson
    python3下django连接mysql数据库
  • 原文地址:https://www.cnblogs.com/evlon/p/354191.html
Copyright © 2011-2022 走看看