利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆

简介:

/*http://evlon.cnblogs.com/archive/2006/03/20/354191.html
ExpandedSubBlockEnd.gif
*/


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

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

None.gif      public   interface  ISingleLogin
ExpandedBlockStart.gif    
{
ExpandedSubBlockStart.gif        
string SigleUserLoginId get; }
InBlock.gif
InBlock.gif        
void SigleUserLogout();
InBlock.gif
ExpandedBlockEnd.gif    }

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

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

ExpandedSubBlockEnd.gif    }

InBlock.gif
ContractedSubBlock.gif    
ISingleLogin 成员
ExpandedBlockEnd.gif}

None.gif

      然后在Web.config中加入HttpModuler:

None.gif < system .web >
None.gif    
< httpModules >
None.gif      
< add  name ="SingleLogin"  type ="BNet.Web.Modulers.SingleLoginModuler" />
None.gif
None.gif    
</ httpModules >
None.gif
</ system.web >
None.gif
      相关的SigleLoginModuler代码如下:
None.gif using  System;
None.gif
using  System.Collections.Generic;
None.gif
using  System.Data;
None.gif
using  System.Configuration;
None.gif
using  System.Web;
None.gif
using  System.Web.UI;
None.gif
None.gif
namespace  BNet.Web.Modulers
ExpandedBlockStart.gif
{
ExpandedSubBlockStart.gif    
/// <summary>
InBlock.gif    
/// SingleLoginModuler 的摘要说明
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class SingleLoginModuler : System.Web.IHttpModule
ExpandedSubBlockStart.gif    
{
InBlock.gif        
const string sigle_login_userid = "evlon_siglelogin_userid";
InBlock.gif        
const string sigle_pre_logout_sessionid = "evlon_sigle_pre_logout_sessionid";
InBlock.gif
InBlock.gif        
static StringLifeValueDictionary loginedUserIdDictionary = null;
InBlock.gif        
static StringLifeValueDictionary LoginedUserIdDictionary
ExpandedSubBlockStart.gif        
{
InBlock.gif            
get
ExpandedSubBlockStart.gif            
{
InBlock.gif                
if (loginedUserIdDictionary == null)
ExpandedSubBlockStart.gif                
{
InBlock.gif                    loginedUserIdDictionary 
= new StringLifeValueDictionary();
ExpandedSubBlockEnd.gif                }

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

ExpandedSubBlockEnd.gif                    }

InBlock.gif
InBlock.gif                    
foreach (string key in listRemove)
ExpandedSubBlockStart.gif                    
{
InBlock.gif                        loginedUserIdDictionary.Remove(key);
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
return loginedUserIdDictionary;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
static StringLifeValueDictionary preLogoutSessionIdDictionary = null;
InBlock.gif        
static StringLifeValueDictionary PreLogoutSessionIdDictionary
ExpandedSubBlockStart.gif        
{
InBlock.gif            
get
ExpandedSubBlockStart.gif            
{
InBlock.gif                
if (preLogoutSessionIdDictionary == null)
ExpandedSubBlockStart.gif                
{
InBlock.gif                    preLogoutSessionIdDictionary 
= new StringLifeValueDictionary();
ExpandedSubBlockEnd.gif                }

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

ExpandedSubBlockEnd.gif                    }

InBlock.gif
InBlock.gif                    
foreach (string key in listRemove)
ExpandedSubBlockStart.gif                    
{
InBlock.gif                        preLogoutSessionIdDictionary.Remove(key);
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
return preLogoutSessionIdDictionary;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

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

InBlock.gif
ContractedSubBlock.gif        
IHttpModule 成员
ExpandedSubBlockEnd.gif    }

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

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class StringLifeValueDictionary : Dictionary<string, LifeValue>
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
InBlock.gif    
public interface ISingleLogin
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
string SigleUserLoginId get; }
InBlock.gif
InBlock.gif        
void SigleUserLogout();
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}



本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2006/03/21/354569.html,如需转载请自行联系原作者
相关文章
|
2天前
|
Java 应用服务中间件 Apache
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
17 7
|
4天前
|
XML 开发框架 .NET
【已解决】请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记
【已解决】请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记
7 1
|
22天前
|
JavaScript 前端开发
基于 Node.js 环境,使用内置 http 模块,创建 Web 服务程序
基于 Node.js 环境,使用内置 http 模块,创建 Web 服务程序
|
23天前
|
存储 人工智能 应用服务中间件
Web应用是一种通过互联网浏览器和网络技术在互联网上执行任务的计算机程序
【5月更文挑战第30天】Web应用是一种通过互联网浏览器和网络技术在互联网上执行任务的计算机程序
29 2
|
5天前
|
安全 编译器 PHP
PHP 8 的新特性与优化——构建更高效的Web应用程序
PHP 8 是最新的PHP版本,它引入了一系列令人激动的新特性和优化,为开发者提供了更多的工具和功能来构建高效的Web应用程序。本文将介绍PHP 8的一些重要特性,包括 JIT 编译器、新的数据结构、类型系统改进以及错误处理的增强。我们还将探讨如何利用这些新特性和优化,提升Web应用程序的性能和可维护性。
15 0
|
1月前
|
JavaScript
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
|
15天前
|
移动开发 Java Maven
基于OSGi的Virgo Server最简单Spring web实例
基于OSGi的Virgo Server最简单Spring web实例
19 0
|
18天前
|
XML JSON API
RESTful API关键部分组成和构建web应用程序步骤
RESTful API关键部分组成和构建web应用程序步骤
14 0
|
1月前
|
存储 安全 数据安全/隐私保护
Web应用程序的会话管理是一种跟踪和识别特定用户与Web服务器之间交互的技术
【5月更文挑战第12天】Python Web开发中,会话管理用于跟踪用户与服务器交互,如Flask框架提供的内置功能。以下是一个简单示例:安装Flask后,设置应用密钥,通过session读写用户状态。例如,创建一个显示和设置用户名称的Web应用,用户提交的名字将保存在会话中。在生产环境中,应安全存储密钥,如使用环境变量。扩展会话管理可借助第三方库实现更多功能,但可能需更多配置。
227 2
|
1月前
|
监控 测试技术 API
Python Web应用程序构建
【4月更文挑战第11天】Python Web开发涉及多种框架,如Django、Flask和FastAPI,选择合适框架是成功的关键。示例展示了使用Flask创建简单Web应用,以及如何使用ORM(如SQLAlchemy)管理数据库。
59297 7