现在我想要做的是,我又一个登出的按钮,我点击登出,从session 中取出我登录时,在session 中保存的用户,之后改变数据库中,改用户的状态时登出状态, 如果用户并没有直接点登出而是直接关闭浏览器,我怎么样才能改变数据库中该用户的状态。
解决方案 »
- visual studio 2010如何开发移动web窗体
- 如何实现iframe窗本刷新另一iframe窗体
- 怎么生成类dll文件,然后再怎么调用这个dll文件?
- 怎么取到日期控件的值?
- RadioButtonList进行选择的问题,没有分了,谢谢大家帮忙~
- 新手请教:请问一下怎么在一个asp.net(vb.net)页面里用服务器端控件和客户端(javascript)综合起来验证,这样的。。。
- 怎么实现远程上传文件
- .net 输出Html页面问题
- 各位老大,怎么样修改DataGrid中的TextBox的大小(编辑记录时),谢谢!!!
- 动态定义声称label 为何不显示
- asp.net 导出PDF 文件! 大侠帮忙。。在线等。。 谢谢啦
- 简单 问题 明天下班结帖!!
由于不同的浏览器对session的支持不一样,所以很难做到客户退出的服务器端监测
例如你举出的用户直接关闭浏览器,这时候属于浏览器非法关闭行为,即使使用脚本也无法实现这种非正常关闭的监测
所以目前对禁止单账号同时多用户登录的问题有两种解决方法
一、定时对无操作的用户清空登录状态
二、如果账号被二次登录,顶出上次登录的账号,这样也只能实现单账号单用户使用
在用户登录的时候可以考虑使用application来存储每个登录用户的session,用ajax心跳检测某用户是否已经登出。考虑的不甚周全,期待高手解答!
//首先设置web.config文件;
<sessionState mode="StateServer" cookieless="false" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" timeout="1"/> //然后在登入事件中加入; ///同一时间点,检查登录用户ID的唯一性///</summary> ///<param name="strZh">用户ID </param> ///<returns></returns> private bool ckeckUserOnlyOne(string strZh) { string strTempZh=strZh; if (Cache[strZh] == null) { TimeSpan SessTimeout = new TimeSpan(0,0,System.Web.HttpContext.Current.Session.Timeout,0,0); HttpContext.Current.Cache.Insert(strTempZh,strTempZh,null, DateTime.MaxValue, SessTimeout, System.Web.Caching.CacheItemPriority.NotRemovable, null); return true; } else return false;}//复制代码
//然后在登出事件加入;
try { Session.Abandon(); System.Web.HttpContext.Current.Session.RemoveAll(); Cache.Remove("用户ID"); } catch (Exception ex) { }//复制代码
//主角登场了,在每个页面引入下面的JS;
<script>var step=0; function myRefresh() { var httpRequest = new ActiveXObject("microsoft.xmlhttp"); httpRequest.open("GET", "delSession.aspx", false); httpRequest.send(null); step ++; if(step <2)//注意2 { setTimeout("myRefresh()",30*1000); //30秒 } } myRefresh();</script>
//项目的Root目录下new一个delSession.aspx文件,然后在她的page_laod方法中写上Response.Expires = -1;
然后服务器定时清理最近没有收到消息的用户
Session.Abandon();
FormsAuthentication.SignOut();
修改数据库中登录状态
ajax轮询查询用户状态
我最近也在做,只是用的是基于SAML协议的SSO,里面涉及到证书什么的,也纠结的很!!!