实现类似QQ单一账户登录,在另一个地方登录后在原登录窗口提示下线
首先,使用框架做的最好,可以在框架页直接做一次就好了
再登陆成功后保存session的代码后添加以下代码:
注意:需要引入命名空间using System.Collections;
SetApplication("Online", clientContext.UserInfoID);
然后写SetApplication方法
1 public static void SetApplication(string key, string value) 2 { 3 Hashtable hOnline = (Hashtable)HttpContext.Current.Application[key]; 4 if (hOnline != null) 5 { 6 IDictionaryEnumerator idE = hOnline.GetEnumerator(); 7 string strKey = ""; 8 while (idE.MoveNext()) 9 { 10 if (idE.Value != null && idE.Value.ToString().Equals(value)) 11 { 12 strKey = idE.Key.ToString(); 13 hOnline[strKey] = "XXXXXX"; 14 break; 15 } 16 } 17 } 18 else 19 { 20 hOnline = new Hashtable(); 21 } 22 hOnline[HttpContext.Current.Session.SessionID] = value; 23 HttpContext.Current.Application.Lock(); 24 HttpContext.Current.Application[key] = hOnline; 25 HttpContext.Current.Application.UnLock(); 26 }
登录部分做好后开始在Global.asax页面中添加代码
1 protected void Session_End(object sender, EventArgs e) 2 { 3 Hashtable hOnline = (Hashtable)Application["Online"]; 4 if (hOnline[Session.SessionID] != null) 5 { 6 hOnline.Remove(Session.SessionID); 7 Application.Lock(); 8 Application["Online"] = hOnline; 9 Application.UnLock(); 10 Session["ClientContext"] = null; 11 } 12 }
然后开始在框架页写代码
我用到的是使用JQuery调用webservise方法进行验证是否在其他地方登录
jquery代码如下:
首先使用定时器调用这个方法
1 $(document).ready(function () { 2 setInterval(CheckLogin, 5000); 3 }); 4 function CheckLogin() { 5 var parameters = { a: currentLoginUserID }; 6 $.ajax({ 7 type: "POST", 8 url: "/WebService/CSICommonWebService.asmx/CheckLogin", 9 contentType: "application/json; charset=utf-8", 10 dataType: "json", 11 data: JSON.stringify(parameters), 12 success: function (data) { 13 if (data.d != null && data.d != "" && data.d != undefined) { 14 alert('你的帐号已在别处登陆,你被强迫下线!'); window.open('/Index.aspx', '_parent'); 15 } 16 return true; 17 }, 18 error: function (ex) { 19 return false; 20 } 21 }); 22 23 }
然后在webservise(CSICommonWebService.asmx)页面中添加下面代码
1 [WebMethod(EnableSession = true)] 2 public string CheckLogin(string a) 3 { 4 Hashtable hOnline = (Hashtable)Application["Online"]; 5 if (hOnline != null) 6 { 7 IDictionaryEnumerator idE = hOnline.GetEnumerator(); 8 while (idE.MoveNext()) 9 { 10 if (idE.Key != null && idE.Key.ToString().Equals(Session.SessionID)) 11 { 12 if (idE.Value != null && "XXXXXX".Equals(idE.Value.ToString())) 13 { 14 hOnline.Remove(Session.SessionID); 15 Application.Lock(); 16 Application["Online"] = hOnline; 17 Application.UnLock(); 18 SessionLocator.Delete("ClientContext"); 19 return "你的帐号已在别处登陆,你被强迫下线!"; 20 } 21 } 22 } 23 return ""; 24 } 25 else 26 { 27 return ""; 28 } 29 }
做完这些以后,你可以调试了,已经成功了,登陆之后在另一个地方登录,5秒钟之内就会提醒下线,大功告成!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库