c# .net mvc 下怎么写做防止用户同时登陆 我要的是web上的,多台电脑上,比如,A电脑登陆,B电脑则不能登陆或者A电脑被挤下线。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那你搞一下存在数据库中的Session. 在数据库的用户表中记录下LastSessionId,保存最近登录的会话id。登录的时候更新它。访问一切资源的时候判断,这个SessionID和当前的是不是一样,如果不同,说明后面又登录了,于是当前用户下线。 @devmiao 访问一切资源都要判断,这样会不会太麻烦了。 你要在内部维护一个已登录用户的字典表,这个字典用SessionID作键,用户ID作值。如果再有用户登录进来,根据新登录的用户ID,把原有相同ID的用户信息从登录字典表清除掉。当原有用户根据原有的SessionID再次访问时,因找不到自己的Key,系统提示你已经被挤下来了。如果不让新用户登录。则更简单。这个mvc原生的登录是不支持的,你必须另写自己的登录逻辑。 这是我从网上找的代码,稍加整理,在登陆时,调用此方法,但是不知道为什么没效果? public void PreventRepeatLogin(FormCollection collection) { string username = collection["username"]; User user = this.userRespository.Single(t => t.Username == username); //防止用户同时登陆 if (username != "") { Hashtable h = (Hashtable)HttpContext.Cache.Get("online"); if (h != null) { IDictionaryEnumerator el = h.GetEnumerator(); bool flag = false; while (el.MoveNext())//循环遍历查找该用户 { if (el.Value.ToString()==username) //需正常退出,释放session {//找到用户 flag = true; break; } } if (flag)//找到用户 { username = ""; //提示登录失败,已登录 return; } else { if (user.Username == username) { h.Add(Session.SessionID, Session["userid"]); HttpContext.Cache.Insert("online", h); } } } else { if (user.Username ==username) { h.Add(Session.SessionID, Session["userid"]); HttpContext.Cache.Insert("online", h); } } } }————————————————这是注销时的对Session释放的代码 //[HttpPost] public ActionResult Logout() { LogoutCache(); LoginHelper.Logout(); Session.Abandon(); return RedirectToAction("Login", "Account"); } public void LogoutCache() { Hashtable h = (Hashtable)HttpContext.Cache["online"]; if (h != null) { if (h[Session.SessionID] != null) { h.Remove(Session.SessionID); HttpContext.Cache.Insert("online", h); } }————————————求解? 今天调试了,Session还是不行,采用了另一种方法:逻辑:用一个登陆时在线时的时间和当前时间做对比,这个登陆时的在线时间通过页面异步刷新,不断更新时间(这个页面必须是模板页面,即所有其他页面都要加载的页面)。逻辑:用一个登陆时在线时的时间和当前时间做对比,这个登陆时的在线时间通过页面异步刷新,不断更新时间.这个页面必须是模板页面,即所有其他页面都要加载的页面。具体步骤:1.在用户表中添加LastOnLine,并初始化LastOnLine字段:___________________________________2.在登陆时用当前时间和LastOnLine 中的时间比较:注意在登陆成功之后再更新下LastOnLine字段,防止页面刷新的时间间隔内可以同时登陆;判定:当前时间+3分钟 >现在时间,则认为还在线,否则认为退出了;————————————————3.正常退出时,将LastOnLine 字段时间设置为最小,这样下次可以即刻登陆,不用等待3分钟:另外要捕捉异常,防止页面超时情况出现,不能正常退出,仍要等待:4.页面异步刷新代码:5.前台脚本代码:注意这个页面必须是模板页面,也就是每个页面都要加载的页面才行; VS 2008APP_DATA 文件夹中添加不了数据库问题 (急,在线等)关于框架的问题(C#+asp.net) 什么是 WC3? 怎样防止用户上传文件过大? 看书的过程中,有一段代码不明白,请大家作详细注释! 200分求解数据库连接问题 求一个方案--------查询总数 大师们如何用asp.net调用exe文件,没接触过 请问手机开发有哪些方面? 实体类型 User 不是当前上下文的模型的一部分。 关于循环问题 INSERT 语句与 FOREIGN KEY 约束"FK_Tripinformation_circuit"冲突。该冲突发生于数据库"jiechuwang",表"
登录的时候更新它。
访问一切资源的时候判断,这个SessionID和当前的是不是一样,如果不同,说明后面又登录了,于是当前用户下线。
当原有用户根据原有的SessionID再次访问时,因找不到自己的Key,系统提示你已经被挤下来了。
如果不让新用户登录。则更简单。
这个mvc原生的登录是不支持的,你必须另写自己的登录逻辑。
public void PreventRepeatLogin(FormCollection collection)
{
string username = collection["username"];
User user = this.userRespository.Single(t => t.Username == username); //防止用户同时登陆
if (username != "")
{
Hashtable h = (Hashtable)HttpContext.Cache.Get("online");
if (h != null)
{
IDictionaryEnumerator el = h.GetEnumerator();
bool flag = false;
while (el.MoveNext())//循环遍历查找该用户
{
if (el.Value.ToString()==username) //需正常退出,释放session
{//找到用户
flag = true;
break;
}
}
if (flag)//找到用户
{
username = "";
//提示登录失败,已登录
return;
}
else
{
if (user.Username == username)
{
h.Add(Session.SessionID, Session["userid"]);
HttpContext.Cache.Insert("online", h);
}
}
}
else
{
if (user.Username ==username)
{
h.Add(Session.SessionID, Session["userid"]);
HttpContext.Cache.Insert("online", h);
}
}
}
}
————————————————
这是注销时的对Session释放的代码
//[HttpPost]
public ActionResult Logout()
{
LogoutCache();
LoginHelper.Logout();
Session.Abandon();
return RedirectToAction("Login", "Account");
} public void LogoutCache()
{
Hashtable h = (Hashtable)HttpContext.Cache["online"];
if (h != null)
{
if (h[Session.SessionID] != null)
{
h.Remove(Session.SessionID);
HttpContext.Cache.Insert("online", h);
}
}
————————————求解?
逻辑:用一个登陆时在线时的时间和当前时间做对比,这个登陆时的在线时间通过页面异步刷新,不断更新时间(这个页面必须是模板页面,即所有其他页面都要加载的页面)。逻辑:用一个登陆时在线时的时间和当前时间做对比,这个登陆时的在线时间通过页面异步刷新,不断更新时间.这个页面必须是模板页面,即所有其他页面都要加载的页面。具体步骤:
1.在用户表中添加LastOnLine,并初始化LastOnLine字段:___________________________________
2.在登陆时用当前时间和LastOnLine 中的时间比较:
注意在登陆成功之后再更新下LastOnLine字段,防止页面刷新的时间间隔内可以同时登陆;
判定:当前时间+3分钟 >现在时间,则认为还在线,否则认为退出了;
————————————————
3.正常退出时,将LastOnLine 字段时间设置为最小,这样下次可以即刻登陆,不用等待3分钟:
另外要捕捉异常,防止页面超时情况出现,不能正常退出,仍要等待:4.页面异步刷新代码:5.前台脚本代码:
注意这个页面必须是模板页面,也就是每个页面都要加载的页面才行;