首 页最新软件下载排行文章资讯投稿发布下载专题
维维下载站
您的位置:首页编程开发网络编程ASP编程 → 如何在.net环境下实现用户登录唯一性

如何在.net环境下实现用户登录唯一性

来源:维维整理 发布时间:2009-9-27 17:17:00 人气:

用户在什么环境下登录的,怎么样实现在web开发时用户登录的唯一性?也就是要求同一个用户在同一时间只能登录一次,如果用户已经登录了,那么在退出之前如果再次登录的话就要提示错误信息。

常见的处理方法是,在用户登录的时候,判断此用户是否已经在Application中存在,如果存在就报错,不存在的话就加到Application中(Application是所有Session共有的,整个web应用程序唯一的一个对象):

以下是引用片段:

string strUserId = txtUser.Text;   
ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;   
if (list == null)   
{   
  list = new ArrayList();   
}   
for (int i = 0; i < list.Count; i++)   
{   
  if (strUserId == (list[i] as string))   
  {   
  //已经登录了,提示错误信息   
  lblError.Text = "此用户已经登录";   
  return;   
  }   
}   
list.Add(strUserId);   
Application.Add("GLOBAL_USER_LIST", list);

这里使用Cache等保存也行。

下一步是在用户退出时从应用程序中删除用户。我们可以在Global.asax的Session_End事件中处理它:

以下是引用片段:

void Session_End(object sender, EventArgs e)   
{   
  // 在会话结束时运行的代码。   
  // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为   
  // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer   
  // 或 SQLServer,则不会引发该事件。   
  string strUserId = Session["SESSION_USER"] as string;   
  ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;   
  if (strUserId != null && list != null)   
  {   
  list.Remove(strUserId);   
   Application.Add("GLOBAL_USER_LIST", list);   
  }   
}

这没有问题。问题是当用户直接单击浏览器右上角的关闭按钮时出现问题。因为它是直接关闭的,所以Session expiration事件不会立即触发,也就是说,在关闭浏览器然后登录后,它将无法进入。

这里有两种处理方式:

1、使用Javascript方式

在每一个页面中加入一段javascript代码:

以下是引用片段:

window.onbeforeunload=function()   
{   
if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey)
    {   
    window.open("logout.aspx");   
  }   
}

由于在浏览器关闭,刷新,翻页等时执行onbeforeunload方法,因此有必要确定在单击关闭按钮或按下Alt + F4时是否执行了实际关闭操作。

然后在logout.aspx的Page_Load中编写与Session_End相同的方法,并将事件添加到logout.aspx:onload =“javascript:window.close()”

但是,这仍然是一个问题,javascript可能在不同的浏览器中有不同的行为,并且在传递文件时没有判断 - > close。

2,使用xmlhttp方法

将以下javascript添加到每个页面(这些javascript也可以共同编写,每个页面都可以导入)

以下是引用片段:

function myRefresh()   
{   
  var httpRequest = new ActiveXObject("microsoft.xmlhttp");   
  httpRequest.open("GET", "test.aspx", false);   
  httpRequest.send(null);  
}   
setInterval("myRefresh()",30*1000); //30秒

在web.config中设置

以下是引用片段:

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

以下是引用片段:

Response.Expires = -1;

保证不使用缓存,每次都能调用到这个页面。

原理就是:将会话的到期时间设置为一分钟,然后在每个页面上每30秒连接一次测试页以保持会话有效,总共60次,即30分钟。如果用户在30分钟后仍未操作,则会话将过期。当然,如果用户直接关闭浏览器,会话将在一分钟后过期。这符合要求。

相关下载
栏目导航
本类热门阅览