使用Application记录当前登陆用户ID,当正常关闭IE时可以从中去掉用户ID
如果非正常关闭IE,怎么把用户ID去掉。
Session_End里可以去掉ID,但是Session失效时间不能设置太短
正常关闭IE后,又可以再次登陆有没有方法解决
谢~~~~~~~~~~
第一次发贴,帮帮
如果非正常关闭IE,怎么把用户ID去掉。
Session_End里可以去掉ID,但是Session失效时间不能设置太短
正常关闭IE后,又可以再次登陆有没有方法解决
谢~~~~~~~~~~
第一次发贴,帮帮
页面中嵌入js来定时向服务器发消息来进行重设session 这个怎么实现,能说详细点吗?
登录时检查cookie,可以判断是否为正常退出,距上次登录多长时间,如果非正常退出后马上换台机器可能有问题,不过也可以通过较短的时间间隔来弥补。
正常关闭清除cookie
http://community.csdn.net/Expert/topicview.asp?id=4850815至于定时你可以到asp.net板块搜一下
window.onbeforeunload = function()
{
var n = window.event.screenX - window.screenLeft;
var b = n > document.documentElement.scrollWidth-20;
if(b && window.event.clientY < 0 || window.event.altKey)
{
window.event.returnValue = ""; //这里可以放置你想做的操作代码
}
}
</script>
window.onbeforeunload = function()
{
var n = window.event.screenX - window.screenLeft;
var b = n > document.documentElement.scrollWidth-20;
if(b && window.event.clientY < 0 || window.event.altKey)
{
window.event.returnValue = ""; //这里可以放置你想做的操作代码
}
}
</script>
这个能够实现正常关闭IE
主要是异常关闭IE不好搞
控制一个用户只能同时登陆一个。
用Session就可以实现。
如果要代码我给我发邮件:
[email protected]
1用户登录时往数据库写记录,包括用户名和打开本web系统页面数(登录时初始设为1)。
2本页面被关闭或者调转时在onbeforeunload或者onunload中写javascript,用ajax技术后台写
程序,将该用户打开本web系统页面数减一。为零时表示用户没有登录该系统的任何页面,即完全退出该web系统,这时用户可以再重新登录。
3用户打开本系统新的页面,通过页面连接或者页面跳转,或者后台写window.open(),或者手工敲入页面地址等等,反正在响应时,即在页面page_load时,将用户打开本web系统页面数加一。实际上如果是本系统页面本页调转系统其它页面过程,就是一个打开页面数先见后加过程.
4再回头看看第一点,用户登录时,就可以查询数据库用户打开本web系统页面数,为0表示未登录,则提示可以登录。
当然如果系统IIS重起,这时应该清空数据库登录的数据,可以使用服务,检测IIS启动情况,如果未启动,则应去清空数据库登录的数据。
其实不使用数据库,也可用Application来记录,不过要设置锁的形式,如果对于较小访问量的系统还可以,对负责的较大的系统就不行了。
再贴一个供大家参考吧!!Global.asax: void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
Hashtable ht = new Hashtable();
Application["onlineuser"] = ht;
Application["onlinecount"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码
Application.Lock();
Application["onlinecount"] = int.Parse(Application["onlinecount"].ToString()) + 1;
Application.UnLock();
} void Application_AuthenticateRequest(object sender, EventArgs e)
{
try
{
Hashtable ht = (Hashtable)Application["onlineuser"];
bool isAlive = false;
foreach (string key in ht.Keys)
{
if (key == (User.Identity.Name + "%%" + Request.UserHostAddress))
{
isAlive = true;
break;
}
}
if (!isAlive && Request.IsAuthenticated)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
return;
}
else if (isAlive && Request.IsAuthenticated)
{
ht.Remove(User.Identity.Name + "%%" + Request.UserHostAddress);
ht.Add(User.Identity.Name + "%%" + Request.UserHostAddress, DateTime.Now.ToString());
Application["onlineuser"] = ht;
}
}
catch (Exception ee)
{
//Response.Write(ee.Message);
}
}
void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
Application.Lock();
Application["onlinecount"] = int.Parse(Application["onlinecount"].ToString()) - 1;
Application.UnLock();
}用户登录时验证:注意应该是先验证密码,然后再验证,是否登录,最后验证权限!bool logined = false;
if (logined)
{//验证是否允许重复登陆。
Hashtable ht = (Hashtable)Application["onlineuser"];
string tmpKey = "";
foreach (string key in ht.Keys)
{
if (key.Substring(0, key.LastIndexOf("%%")) == Login1.UserName)
{
if (key.Substring(key.LastIndexOf("%%") + 2) == Request.UserHostAddress) break;
else if (DateTime.Parse(ht[key].ToString()).AddMinutes(10) >= DateTime.Now)
{
Response.Write("<script>alert('你已在IP:" + key.Substring(key.LastIndexOf("%%") + 2) + " 上登陆,请在该机上点击注销以退出登陆。');</script>");
logined = false;
break;
}
else
{
tmpKey = key;
}
}
}
if (tmpKey != "")
{
ht.Remove(tmpKey);
}
try
{
if(logined)ht.Add(Login1.UserName + "%%" + Request.UserHostAddress, DateTime.Now.ToString());
}
catch { }
Application["onlineuser"] = ht;
}
--------------------------
给每在线用户增加一个RefreshTime属性,建立一个负责将当前用户的RefreshTime属性设置为当前时间的单独页面(Refresh.aspx),然后在系统的主要页面(也可以是所有页面)中通过xmlhttp不断地请求Refresh.aspx页面,一旦用户关闭了与本系统相关的所有窗口,即以直接关闭浏览器的方式退出系统,那么该用户的RefreshTime属性便不会自动更新了,我们再设置一个自动刷新的超时时间(这个要比会话超时短很多_refreshTimeout),当发现某用户超过_refreshTimeout的时间没有自动刷新,就能判定该用户已经以直接关闭浏览器的方式退出了。
-----------------------------------------------------------------------------------------------
这个是最好的解决方法
你加一个框架页面,在close的时候注销掉你的当前用户如:
<script language="javascript" for="window" event="onunload">
window.open("logout.aspx");
</script>
我这里是调用了logout.aspx去注销。
你可以在框架页面中嵌入一个一直刷新的页面在此页面中进行验证和其它在线操作。
你先要关心的用户怎么登录和退出的问题,举个例子,登录login.aspx,框架页面index.htm包含有top.aspx,leftframe.aspx,rightframe.aspx,online.aspx,登录验证后进行这个index.htm页面在这个框架页面中你想办法将index.htm关闭时执行注销操作,正如我上面写的javascript脚本
<script language="javascript" for="window" event="onunload">
window.open("logout.aspx");
</script>
调用的logout.aspx去注销,在用户列表中删除当前在线用户。
online.aspx这个页面负责在线操作,如用户列表的刷新,它将每隔一段时间进行刷新页面。
即便非法退出online也会去验证在线用户,如(你可以定义操作一定时间没有响应的用户,认为他已经退出)
接下来如何实现在系统中同一帐号不重复登录
你可以在用户列表存储一些信息,来和登录后保存在session中的一些信息是否匹配,来实现
如:
IP地址,在登录时,将用户登录的IP地址存放在session中,和用户在线列表中,将在列表中找有此用户则更新,无此用户添加到列表中
online.aspx来实现踢出重复帐号,当前同一帐号,最后一个登录的用户一定更新了在线列表的信息,那么原来session中的ip和列表中用户信息的ip就会不同,如果不同就提示并退出.
问题解决了,可是项目经理说方法不太好,他说要改为cashe做,具体怎么实现还不太清楚,
他还在研究!我是用thirdman(大肥猪)的这个方法做的
给每在线用户增加一个RefreshTime属性,建立一个负责将当前用户的RefreshTime属性设置为当前时间的单独页面(Refresh.aspx),然后在系统的主要页面(也可以是所有页面)中通过xmlhttp不断地请求Refresh.aspx页面,一旦用户关闭了与本系统相关的所有窗口,即以直接关闭浏览器的方式退出系统,那么该用户的RefreshTime属性便不会自动更新了,我们再设置一个自动刷新的超时时间(这个要比会话超时短很多_refreshTimeout),当发现某用户超过_refreshTimeout的时间没有自动刷新,就能判定该用户已经以直接关闭浏览器的方式退出了。结贴