All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
详细讲解PHP编程中分页显示的制作_[PHP教程]
安装SQL Server 2000的错误及解决_[SQL Server教程]
XSL学习教程:运算符和函数_[XML教程]
PHP技术:回帖脱衣服的图片实现_php资料_编程技术
一个容易忽视的存储过程问题_[SQL,Server教程]
HTML语言剖析(十四)特殊字符_[Html教程]_0
标题太长用省略号来代替简单办法_[Asp.Net教程]
delphi事件的定义及作用
TABLE导入到EXCEL_[Asp.Net教程]
Debian下Apache2+Mysql5+Php5的安装配置_php资料_编程技术
Reading number is top 10 pictures
Sora aoi possession photo1
Kim jong il's mistress, national beauty JinYuJi actor3
乳娘帕梅拉安德森1
The terra-cotta warriors3
The world's top ten most beautiful railway station1
这只猪到底犯了什么错?
每天进步一点点
宝贝系列
The Soviet union swimsuit exposure in the 70 year2
Street street fighting
Download software ranking
Eclipse-CALMSANNY (second edition)
Unix video tutorial19
Call Of Duty2
WebService在.NET中的实战应用教学视频 → 第4集
WebService在.NET中的实战应用教学视频 → 第1集
网络管理员第三版
Tram sex maniac 2 (H) rar bag4
C++编程教程第三版
Proficient in Eclipse
linux初级教程
归海一刀 published in(发表于) 2014/1/30 0:59:16 Edit(编辑)
Asp.net中防止用户多次登录的方法_[Asp.Net教程]

Asp.net中防止用户多次登录的方法_[Asp.Net教程]

Asp.net中防止用户多次登录的方法_[Asp.Net教程]

  在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等保存也可以。


  接下来就是要在用户退出的时候将此用户从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中设置



以下是引用片段:


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



以下是引用片段:
  Response.Expires = -1;


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


  原理就是:设置Session的过期时间是一分钟,然后在每个页面上定时每30秒连接一次测试页面,保持Session有效,总共连60次,也就是30分钟。如果30分钟后用户还没有操作,Session就会过期。当然,如果用户直接关闭浏览器,那么一分钟后Session也会过期。这样就可以满足要求了。


  出处: 中国自学编程网







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.