常见的处理方法是,在用户登录时,判断此用户是否已经在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中设置

以下是引用片段:

< sessionState mode="InProc" timeout="1">< /sessionState>

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

以下是引用片段:

Response.Expires = -1;

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

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

最新文章

  1. 我的MYSQL学习心得(十七) 复制
  2. 后台访问 JS解决跨域问题
  3. CentOS系统 yum 安装 iftop实时流量监控工具
  4. POJ1236Network of Schools[强连通分量|缩点]
  5. 两台Linux主机之间文件的复制
  6. css div垂直居中
  7. iOS - Photo Album 图片/相册管理
  8. IPC——匿名管道
  9. hdu 5278 Geometric Progression 高精度
  10. Vector3.Dot 与Vector3.Cross
  11. java 实例化是调用了子类重写方法
  12. pyqt 自定义例子学习
  13. Mysql两种存储引擎的优缺点
  14. CodeForces 709A Juicer
  15. 最小费用最大流(luogu P3381 【模板】最小费用最大流)
  16. Windows核心编程第一章.错误处理
  17. java this关键字的使用
  18. 弹出层-layui
  19. 【网站管理6】_一个网站SEO优化方案
  20. Linux常用基本命令:三剑客命令之-awk数组用法

热门文章

  1. 自定义DatePicker,年月日,不显示其中某几项
  2. 开机一会,出现长时间闪屏,并且跳出SendRpt error
  3. java clone简单学习
  4. [php]如何更改wamp默认的mysq空密码?
  5. 欢迎来到vmax-tam的博客
  6. jQuery无缝滚动插件
  7. params关键字
  8. modelsim仿真错误解决办法
  9. 一、换系统wince ---到 linux ubuntu 桌面
  10. RHEL6.4找回root密码的方法