对于登陆权限控制问题,我认为Session,Cache,Application都可以

Asp.net中防止用户重复登录一:这种情况用到了Session,此情况适应于单一账户登陆

Ajax调用

View Code
string strUserId = txtName.Text.ToString();
//将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中添加如下代码:

//设置超时为1分钟
<sessionState mode="InProc" timeout="1"></sessionState>

在建立一个轮训页面,用ajax定时get次页面以不断更新session值

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

  Response.Expires =-1;

在每个页面中加入如下的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();

这样就实现了单点登陆的控制

===============================================================================

Asp.net中防止用户重复登录二:Application方法,本人推荐此方法

这种方法是:将用户名和时间以数组形式存入Application里面,在再Ajax轮询页面定时判断当时时间和登陆存入时间的差值;假设差值为1分钟就认为过期

所以当差值大于1分钟时就将Application里面的用户名移除,Ajax默认30秒轮询一次text状态页面,如果没有过期则将时间更新,

当页面非正常退出或者电脑死机时上次登陆时间没变,所以下次登陆是首先ajax轮询状态页面,如果掉线时间超过默认过期时间,则将application移除,则登陆成功

在登陆button里面写入如下代码

在Arraylist数组里面的值是以“;”分隔的,如admin;2010-01-01 12:00:00

View Code
string username1 = txtName.Text.ToString();
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页面:

View Code
publicpartialclass test : System.Web.UI.Page
{
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;
}
}

 

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();

 

posted on 2011-05-11 18:26  高兴happy  阅读(2035)  评论(8编辑  收藏  举报