当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET 用户多次登录的解决方法

ASP.NET 用户多次登录的解决方法

2017年12月12日  | 移动技术网IT编程  | 我要评论

邢远博,h小游戏在线玩,争先创优心得体会

常见的处理方法是,在用户登录时,判断此用户是否已经在application中存在,如果存在就报错,不存在的话就加到application中(application是所有session共有的,整个web应用程序唯一的一个对象):
以下是引用片段:
  string struserid = username.text;
arraylist list = application.get("global_user_list") as arraylist;
if (list == null)
{
list = new arraylist();
}
for (int i = 0; i < list.count; i++)
{
string strlist = list[i].tostring();
if (struserid == strlist)
{
//已经登录了,提示错误信息
response.write("<script language='javascript'>window.alert('此用户已经登录');</script>");
return;
}
}
list.add(struserid);
application.add("global_user_list", list);
  当然这里使用cache等保存也可以。
  接下来就是要在用户退出的时候将此用户从application中去除,我们可以在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过期事件,也就是关闭浏览器后再来登录就登不进去了。
  这里有两种处理方式:
  1、使用javascript方式
  在每一个页面中加入一段javascript代码:
以下是引用片段:
  function window.onbeforeunload()
  {
  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在不同的浏览器中可能有不同的行为,还有就是当通过文件->关闭时没有判断到。
  2、使用xmlhttp方法(这种方法测试下来没有问题)
  在每个页面中加入如下的javascript(这些javascript也可以写在共通里,每个页面引入就可以了)
以下是引用片段:
  var x=0;
  function myrefresh()
  {
  var httprequest = new activexobject("microsoft.xmlhttp");
  httprequest.open("get", "test.aspx", false);
  httprequest.send(null);
  x++;
  if(x<60) //60次,也就是session真正的过期时间是30分钟
  {
  settimeout("myrefresh()",30*1000); //30秒
  }
  }
  myrefresh();
  在web.config中设置
以下是引用片段:
<sessionstate mode="inproc" timeout="1"></sessionstate>
  test.aspx页面就是一个空页面,只不过需要在page_load中加入:
以下是引用片段:
  response.expires = -1;
  保证不使用缓存,每次都能调用到这个页面。
  原理就是:设置session的过期时间是一分钟,然后在每个页面上定时每30秒连接一次测试页面,保持session有效,总共连60次,也就是30分钟。如果30分钟后用户还没有操作,session就会过期。当然,如果用户直接关闭浏览器,那么一分钟后session也会过期。这样就可以满足要求了。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网