同一用户不能同时在线问题 我用asp.net写了一个程序,如何才能控制同一个用户名不能同时在不同的机器上登录啊,要提示他此用户已在其他地方登录拉 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你在Session_End事件那里更新用户的状态不可以吗? 用Application来记录所有在线的用户列表,然后判断. 加上用Session,过期后自动变成未登录状态 njdxbzu(夏三典)怎么记录啊,怎么判断啊能给点代码吗谢谢大侠 http://blog.csdn.net/lengyubing_1983/archive/2006/05/23/751380.aspx try{string sKey = this.txtUserName.Text.Trim()+"_"+this.txtPassword.Text;string sUser = string.Empty;sUser=Convert.ToString(Cache[sKey]);if (sUser == string.Empty || sUser==null || sUser==""){TimeSpan SessTimeOut = new TimeSpan(0,0,0,this.Session.Timeout,0);HttpContext.Current.Cache.Insert(sKey,sKey,null,DateTime.MaxValue,SessTimeOut,System.Web.Caching.CacheItemPriority.NotRemovable,null);Session["User"] = sKey;string validateCode=this.txtValidateCode.Text.ToUpper();if(Session["ValidateCode"]!=null){if(validateCode=="" || validateCode!=Session["ValidateCode"].ToString().ToUpper())this.Response.Redirect(this.Request.ApplicationPath+"sitemessage/message.aspx?msgid=12",true);}else{this.Server.Transfer("/sitemessage/message.aspx?msgid=12",true);}bool result = (new RegUserService()).UserLogin(this.txtUserName.Text,this.txtPassword.Text,Convert.ToInt32(this.ddlCook.SelectedValue));if(!result){this.Response.Redirect(this.Request.ApplicationPath+"sitemessage/message.aspx?msgid=11",true);}else{RegUserService.UpdateUserOnlineState(Visitor.Current.UserID);this.Response.Redirect(this.Request.ApplicationPath+"default.aspx",true);//转向主页}}else{error="<script language='javascript'>alert('用户已登录,请不要重复登录!');";error=error+"location.replace('/Default.aspx')</script>";return;} string sKey = this.txtUserName.Text.Trim()+"_"+this.txtPassword.Text;string sUser = string.Empty;sUser=Convert.ToString(Cache[sKey]);if (sUser == string.Empty || sUser==null || sUser==""){TimeSpan SessTimeOut = new TimeSpan(0,0,0,this.Session.Timeout,0);HttpContext.Current.Cache.Insert(sKey,sKey,null,DateTime.MaxValue,SessTimeOut,System.Web.Caching.CacheItemPriority.NotRemovable,null);Session["User"] = sKey;....//做你想做的事情..else{ //用户已登录.}如果用户关闭浏览器,只能等到SESSION过期了才能登录. 解决用户关闭浏览器问题,可以用JS来捕捉IE的关闭事件,在该事件中跳转到一个注销页面,这个页面实现注销的功能。 楼主有理在body unload事件中 转向到一注销网页即可 只是还不能解决session超时问题 Application["OnlineUser"]中保存登陆用户列表,在登陆的时候判断Application["OnlineUser"]是否为空,不为空就就判断是否存在指定用户if (Application["OnlineUser"] != null){ ArrayList OnlineUserArr = (ArrayList)Application["OnlineUser"]; if (OnlineUserArr.IndexOf(userName) >= 0) // { //TODO:执行用户已登陆的处理 } else { Application.Lock(); OnlineUserArr.Add(userName); Application["OnlineUser"] = OnlineUserArr; Session["UserName"]=userName;//用于Session_End中删除和其他用处 Application.UnLock(); }}另外在Session_End中执行从Application中删除的命令Application.Remove(userName);这个userName可以从Session["UserName"]取.但是在一个用户退出并在Session失效时间前重新登陆的话这里可能要增加对IP的判断看是否需要拒绝登陆,就是Application和Session中跟用户一起记录IP信息.Session_End只对Session保存在内存中有效,保存到数据库或状态服务器无效. 另外说一句,不用纯粹用Session去保存登陆的用户列表,同一个用户在不同地方登陆其SESSION是不互访的.也不要使用cache,并不保证cache是否只有创建的用户可以访问,而且它可能会自动清理的.无只做了一个Asp.net小程序,有些认识可能不对,希望大家指正. 更新 jscript intellisense 出错 json数据转换问题 Visual Studio 2008编译asp.net程序遇到一个错误 页面导成Excel的问题 返回Gridview时候,需要定位是哪页,哪行??--在线等!只要能实现就结贴 所有池连接都已被使用并已达到最大池大小。是什么原因? 插入数据时出现:对象必须实现 IConvertible 超简单的搜索结果问题 各位高手 请帮忙看看 WebFrom 下如何用水晶报表 如何在新页面里显示一个图片文件? DataGrid选择资料和编辑的问题
怎么记录啊,怎么判断啊
能给点代码吗
谢谢大侠
{
string sKey = this.txtUserName.Text.Trim()+"_"+this.txtPassword.Text;
string sUser = string.Empty;
sUser=Convert.ToString(Cache[sKey]);
if (sUser == string.Empty || sUser==null || sUser=="")
{
TimeSpan SessTimeOut = new TimeSpan(0,0,0,this.Session.Timeout,0);
HttpContext.Current.Cache.Insert(sKey,sKey,null,DateTime.MaxValue,SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,null);
Session["User"] = sKey;
string validateCode=this.txtValidateCode.Text.ToUpper();if(Session["ValidateCode"]!=null)
{
if(validateCode=="" || validateCode!=Session["ValidateCode"].ToString().ToUpper())
this.Response.Redirect(this.Request.ApplicationPath+"sitemessage/message.aspx?msgid=12",true);
}
else
{
this.Server.Transfer("/sitemessage/message.aspx?msgid=12",true);
}
bool result = (new RegUserService()).UserLogin(this.txtUserName.Text,this.txtPassword.Text,Convert.ToInt32(this.ddlCook.SelectedValue));if(!result)
{
this.Response.Redirect(this.Request.ApplicationPath+"sitemessage/message.aspx?msgid=11",true);
}
else
{
RegUserService.UpdateUserOnlineState(Visitor.Current.UserID);
this.Response.Redirect(this.Request.ApplicationPath+"default.aspx",true);//转向主页
}
}
else
{
error="<script language='javascript'>alert('用户已登录,请不要重复登录!');";
error=error+"location.replace('/Default.aspx')</script>";
return;
}
string sUser = string.Empty;
sUser=Convert.ToString(Cache[sKey]);
if (sUser == string.Empty || sUser==null || sUser=="")
{
TimeSpan SessTimeOut = new TimeSpan(0,0,0,this.Session.Timeout,0);
HttpContext.Current.Cache.Insert(sKey,sKey,null,DateTime.MaxValue,SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,null);
Session["User"] = sKey;
..
..//做你想做的事情
..else
{
//用户已登录.
}
如果用户关闭浏览器,只能等到SESSION过期了才能登录.
在body unload事件中 转向到一注销网页即可 只是还不能解决session超时问题
,在登陆的时候判断Application["OnlineUser"]是否为空
,不为空就就判断是否存在指定用户
if (Application["OnlineUser"] != null)
{
ArrayList OnlineUserArr = (ArrayList)Application["OnlineUser"];
if (OnlineUserArr.IndexOf(userName) >= 0) //
{
//TODO:执行用户已登陆的处理
}
else
{
Application.Lock();
OnlineUserArr.Add(userName);
Application["OnlineUser"] = OnlineUserArr;
Session["UserName"]=userName;//用于Session_End中删除和其他用处
Application.UnLock();
}
}
另外在Session_End中执行从Application中删除的命令
Application.Remove(userName);
这个userName可以从Session["UserName"]取.但是在一个用户退出并在Session失效时间前重新登陆的话这里可能要增加对IP的判断看是否需要拒绝登陆,就是Application和Session中跟用户一起记录IP信息.Session_End只对Session保存在内存中有效,保存到数据库或状态服务器无效.