防止论坛用户重复登录的方法

原创 2006年06月19日 14:38:00

本例完成的功能就是防止用户重复登录!若用户已经登录,则当其再次登录时,弹出提示框后返回!

实现思路:用户登录成功后,将用户登录信息存放到Hashtable类型的Application["Online"]里面,其键值为SessionID,其Value值为用户ID;当用户注销时,调用Session.Abandon;在Global.asax里面的SessionEnd事件中,将用户ID从Hashtable中删除;在用户访问页面时,察看Hashtable中是否有对应的用户ID如果没有则判断用户不在线(用户不在线的原因可能是按了注销按钮、网页超时等)

1、公用类中判断用户是否在线的函数(供用户调用)
/// <summary>
/// 判断用户strUserID是否包含在Hashtable h中
/// </summary>
/// <param name="strUserID"></param>
/// <param name="h"></param>
/// <returns></returns>
public static bool AmIOnline(string strUserID,Hashtable h)
{
if(strUserID == null)
return false;

//继续判断是否该用户已经登陆
if(h == null)
return false;

//判断哈希表中是否有该用户
IDictionaryEnumerator e1 = h.GetEnumerator();
bool flag = false;
while(e1.MoveNext())
{
if(e1.Value.ToString().CompareTo(strUserID) == 0)
{
flag = true;
break;
}
}
return flag;
}

2、用户登录事件处理:
private void btnlogin_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{ ////User为自定义的类,其中包含Login方法
User CurUser = new User();
CurUser.UserID = this.username.Text.Trim();

if(MyUtility.AmIOnline(CurUser.UserID,(Hashtable)Application["Online"]))
{
JScript.Alert("您所使用的登录ID已经在线了!您不能重复登录!");
return;
}

CurUser.LoginPsw = FormsAuthentication.HashPasswordForStoringInConfigFile(this.password.Text.Trim(),"SHA1");
int ii = CurUser.Login();
StringBuilder sbPmt = new StringBuilder();

switch(ii)
{
case 0: //如果登录成功,则将UserID加入Application["Online"]中
Hashtable h = (Hashtable)Application["Online"];
if(h == null)
h = new Hashtable();
h[Session.SessionID] = CurUser.UserID;
Application["Online"] = h;

Session["UserID"] = CurUser.UserID;
Session["UserNM"] = CurUser.UserNM;
Session["RoleMap"] = CurUser.RoleMap;
Session["LoginPsw"] = CurUser.LoginPsw;
Session["LoginTime"] = DateTime.Now;
Response.Redirect("ChooseRole.aspx");
break;
case -1:
JScript.Alert("用户名错误!");
break;
case -2:
JScript.Alert("密码错误!");
break;
default:
sbPmt.Append("登录过程中发生未知错误!");
JScript.Alert(sbPmt.ToString());
break;
}
return;
}

3、在Global.asax中的Session_End事件:
protected void Session_End(Object sender, EventArgs e)
{
Hashtable h=(Hashtable)Application["Online"];

if(h[Session.SessionID]!=null)
h.Remove(Session.SessionID);

Application["Online"]=h;
}

4、在每一个页面需要刷新的地方,调用如下代码:
try
{
if(!common.MyUtility.AmIOnline(Session["UserID"].ToString(),(Hashtable)Application["OnLine"]))
{
//用户没有在线 ,转到登录界面
Response.Write("<script>parent.document.location.href='Login.aspx';</script>"); ////有框架时用
//Response.Redirect("login.aspx"); ////无框架时用
return;
}
}
catch
{
//会话过期 ,转到登录界面
Response.Write("<script>parent.document.location.href='Login.aspx';</script>"); ////有框架时所用
//Response.Redirect("login.aspx"); ////无框架时用
return;
}

深入思考
由本例的解决方法可以加以延伸,比如,在存储UserID的时候,将UserID+客户端IP地址一起存进去,则在将相应信息取出来分析的时候,可以做到:当用户在不同的计算机上先后登录的时候,则允许最近一次的登录,而将之前的登录删除!等等等等 

相关文章推荐

C#防用户重复登录的方法.NET

  • 2011年02月24日 17:00
  • 2KB
  • 下载

Web应用中防止用户重复登录的简单实现方法

主要使用application, listener, 把用户id和用户对象放到ConcurrentHashMap中,再存入application中 1、登录时把id和对象放到applicat...
  • KimSoft
  • KimSoft
  • 2011年08月29日 16:00
  • 5769

jsp防止重复登录问题以及关闭浏览器,意外断电等情况使用户退出的解决方法

一、防止用户重复登录 这是登录请求界面submitLogin.jsp,只有java代码:   ...

防止用户重复登录

  • 2008年06月03日 21:36
  • 3KB
  • 下载

Asp.net中防止用户重复登录示例

  • 2012年05月29日 22:08
  • 7KB
  • 下载

防止用户将表单重复提交的方法汇总

防止用户将表单重复提交的方法汇总: 1.禁掉提交按钮 2.Post/Redirect/Get模式 3.在session中存放一个特殊标志 4.在数据库里添加约束...

【转载】 java web项目防止多用户重复登录解决方案

作者:永恒の_☆    地址:http://blog.csdn.net/chenghui0317/article/details/9373345

java web项目防止多用户重复登录解决方案

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者:永恒の_☆    地址:http://blog.csdn.net/chenghu...

Yii2 防止用户重复登录

1.新建存放用户登录口令token的表,并生成model CREATE TABLE IF NOT EXISTS `tbl_admin_session` ( `session_id` int(11)...
  • navioo
  • navioo
  • 2016年07月21日 10:06
  • 1558

session监听防止用户登录重复

思路,主要是实现一些session监听器的接口,在session中set属性时,判断是不是user对象,然后缓存下来,userName为key,session对象为value, 然后,每次登录的时候...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:防止论坛用户重复登录的方法
举报原因:
原因补充:

(最多只允许输入30个字)