对于登陆权限控制问题,我认为Session,Cache,Application都可以
Asp.net中防止用户重复登录一:这种情况用到了Session,此情况适应于单一账户登陆
Ajax调用
//将Session转换为Arraylist数组
ArrayList list = Session["GLOBAL_USER_LIST"] as ArrayList;
if (list ==null)
{
list =new ArrayList();
}
for (int i =0; i < list.Count; i++)
{
if (strUserId == (list[i] asstring))
{
//已经登录了,提示错误信息
Response.Write("<script>alert('该用户已经登录,不允许重复登录')</script>");
return;
}
}
//将用户信息添加到list数组中
list.Add(strUserId);
//将数组放入Session
Session.Add("GLOBAL_USER_LIST", list);
这样就将用户登陆信息保存到Session里面
但是这样的话用户一旦登陆,第二次就永远无法在登陆了;
所以就要考虑用户是否过期,还有ie非正常关闭,电脑死机等问题
在Web.config中添加如下代码:
<sessionState mode="InProc" timeout="1"></sessionState>
在建立一个轮训页面,用ajax定时get次页面以不断更新session值
test.aspx页面就是一个空页面,只不过需要在Page_Load中加入:
在每个页面中加入如下的javascript(这些javascript也可以写在共通里,每个页面引入就可以了)
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();
这样就实现了单点登陆的控制
===============================================================================
Asp.net中防止用户重复登录二:Application方法,本人推荐此方法
这种方法是:将用户名和时间以数组形式存入Application里面,在再Ajax轮询页面定时判断当时时间和登陆存入时间的差值;假设差值为1分钟就认为过期
所以当差值大于1分钟时就将Application里面的用户名移除,Ajax默认30秒轮询一次text状态页面,如果没有过期则将时间更新,
当页面非正常退出或者电脑死机时上次登陆时间没变,所以下次登陆是首先ajax轮询状态页面,如果掉线时间超过默认过期时间,则将application移除,则登陆成功
在登陆button里面写入如下代码
在Arraylist数组里面的值是以“;”分隔的,如admin;2010-01-01 12:00:00
ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;
if (list ==null)
{
list =new ArrayList();
}
for (int i =0; i < list.Count; i++)
{
string userskey = list[i].ToString();
string usernames = userskey.Substring(0, userskey.IndexOf(";"));
if (username1 == usernames)
{
//已经登录了,提示错误信息
Response.Write("<script>alert('该用户已经登录,不允许重复登录')</script>");
return;
}
}
string Time = DateTime.Now.ToLocalTime().ToString();
string userkey = username1 +";"+ Time;
list.Add(userkey);
Application.Add("GLOBAL_USER_LIST", list);
状态页面text.aspx页面:
{
protectedvoid Page_Load(object sender, EventArgs e)
{
//获取Application,并将其转换为Arraylist数组默认数组存值为admin;2010-01-01 12:00:00
ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;
//获取本地时间
DateTime Times = DateTime.Now.ToLocalTime();
if (list !=null)
{
for (int i =0; i < list.Count; i++)
{
string userskey = list[i].ToString();
//获取时间
string time = userskey.Substring(userskey.IndexOf(";") +1);
//获取用户名
string username = userskey.Substring(0, userskey.IndexOf(";")+1);
DateTime Time = Convert.ToDateTime(time);
//判断时间是否过期
bool s = GetTime(Time);
if (s)
{
//如果时间过期则移除用户信息
list.RemoveAt(i);
Response.Redirect("login.aspx");
}
else
{
//否则将用户信息,时间更新,
list.RemoveAt(i);
string Time2 = DateTime.Now.ToLongTimeString();
list.Add(username + Time2);
}
}
}
}
///<summary>
/// 判断时间是否过期
///</summary>
///<param name="Time">上次轮询或者登陆时间</param>
///<returns></returns>
publicstaticbool GetTime(DateTime Time)
{
DateTime TimeNow = DateTime.Now.ToLocalTime();
DateTime Time2 = Convert.ToDateTime(Time);
TimeSpan type = TimeNow - Time2;
bool sa =false;
if (Convert.ToDateTime(type.Hours +":"+ type.Minutes +":"+ type.Seconds) > Convert.ToDateTime("00:01:00"))
{
sa =true;
}
return sa;
}
}
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();