用户在什么环境下登录的,怎么样实现在web开发时用户登录的唯一性?也就是要求同一个用户在同一时间只能登录一次,如果用户已经登录了,那么在退出之前如果再次登录的话就要提示错误信息。
常见的处理方法是,在用户登录的时候,判断此用户是否已经在Application中存在,如果存在就报错,不存在的话就加到Application中(Application是所有Session共有的,整个web应用程序唯一的一个对象):
以下是引用片段:
|
这里使用Cache等保存也行。
下一步是在用户退出时从应用程序中删除用户。我们可以在Global.asax的Session_End事件中处理它:
以下是引用片段:
|
这没有问题。问题是当用户直接单击浏览器右上角的关闭按钮时出现问题。因为它是直接关闭的,所以Session expiration事件不会立即触发,也就是说,在关闭浏览器然后登录后,它将无法进入。
这里有两种处理方式:
1、使用Javascript方式
在每一个页面中加入一段javascript代码:
以下是引用片段:
|
由于在浏览器关闭,刷新,翻页等时执行onbeforeunload方法,因此有必要确定在单击关闭按钮或按下Alt + F4时是否执行了实际关闭操作。
然后在logout.aspx的Page_Load中编写与Session_End相同的方法,并将事件添加到logout.aspx:onload =“javascript:window.close()”
但是,这仍然是一个问题,javascript可能在不同的浏览器中有不同的行为,并且在传递文件时没有判断 - > close。
2,使用xmlhttp方法
将以下javascript添加到每个页面(这些javascript也可以共同编写,每个页面都可以导入)
以下是引用片段:
|
在web.config中设置
以下是引用片段:
test.aspx页面就是一个空页面,只不过需要在Page_Load中加入:
以下是引用片段:
Response.Expires = -1;
保证不使用缓存,每次都能调用到这个页面。
原理就是:将会话的到期时间设置为一分钟,然后在每个页面上每30秒连接一次测试页以保持会话有效,总共60次,即30分钟。如果用户在30分钟后仍未操作,则会话将过期。当然,如果用户直接关闭浏览器,会话将在一分钟后过期。这符合要求。