Asp.net用户多次登录问题
web开发时,有的系统要求同一个用户在同一时间只能登录一次,也就是如果一个用户已经登录了,在退出之前如果再次登录的话会提示已经登录过来,不能再登录了
上面的两种情况第一种很好处理,我们只需要把登过的用户放到集合中,然后把集合放到application中即可,下次再登录的时候判断用户是否存在,即可,但是在退出的时候,一定要记得在退出事件中将用户移除
部分代码如下:
string strUserId = txtUser.Text;
ArrayList list = Application.Get("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);
退出的时候:
第二种情况我们就要好好分析一下
web.config中
<sessionState mode="InProc" timeout="1"></sessionState>
但是,如果session的过期时间这么少,那么相应的用户就要不停的操作,否则就会过期,所以我们要相应的做一下处理,让session在半小时内不过期,始终保持有效,半小时后在不操作就会过期,当然,如果用户直接关闭浏览器,那么一分钟后Session也会过期。这样就可以满足要求了
在每个页面中加入如下的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也会过期。这样就可以满足要求了
所以这两种情况一结合,我们就可以直接都在Global.asax的Session_End事件中处理就可以了,在退出的事件中,我们直接将session会话取消就可以了
Session.Abandon();
这样就会执行Session_End事件了!