一个登陆账号,
只能有一台电脑登陆,
当这个账号在登陆时,
假如另一台电脑用同样的账号登陆,拒绝登陆
如何做到
只能有一台电脑登陆,
当这个账号在登陆时,
假如另一台电脑用同样的账号登陆,拒绝登陆
如何做到
解决方案 »
- gridview的删除问题?
- 服务器端传值并调用js 问题 简单问题希望给个答案
- DataGrid.Items.Cell.Control分别都是指的什么东西
- 在windows应用程序中,就是form,怎样在DataGrid点击一行,下面的TextBox自动与其绑定,显示该行信息--急求急求!!
- label的换行问题! 无论怎么改属性都不能自动换行
- javascript怎么预览和判断图片大小??
- 问个关于连接的问题
- 我初始化页面后,点击button弹出窗口(windows.open)或弹出window.alert();再刷新页面后;怎样可以不再弹出窗口或window.alert()!;
- 如何实现这样的图片超链接?
- 做过水晶报表的朋友帮我看一下!SOS
- 调用FlashPaper出错
- .net如何实现实现合成、变色、旋转、看效果图等功能
在用户注销session或者关闭浏览器的时候再global.asax中的回话结束事件中将那列的标志给修改掉。
这样做把浏览器cookie清空以后,哪台电脑都登录不上了。
只知道理论,不知道怎么实现。
用户登录后把用户的session和sessionid到applaction里,下次登录时判断是否已经存在,存在的话就把对应的sessionid找到session销毁,清除cook,然后再添加新的数据
哈哈,不必清cookie,只要把浏览器一关,哪台电脑都登不上喽
举个简单的例子,你到银行去存了一笔钱,然后离开柜台(断开连接)。那么你下次去取钱时,柜台服务人员并不认识你,所以银行服务员至少需要知道你的帐号,才能确定你上次、上上次、上上上次……的存钱情况,也就是客户端的状态数据。这个帐号就相当于cookie。cookie 最最基本的原理大概就是这样,客户端每次向服务器提交请求时,会把cookie同时传给服务器,服务器根据cookie值取出上次你保存下来的信息。回到楼主的问题
如果我已经在 A 地用帐号 Account1 登录,系统标记 Account1 已经登录。
那么必须给客户提供一个“注销”的操作,服务端会标记 Account1 不是登录状态。
但是问题是,客户很有可能直接把浏览器关闭,或者客户端死机,死浏览器等等等等,这样服务端就不知道客户已经退出,Account1 依然是登录状态。这样一来,Account1 就再也无法登录了。因此,好的处理方案应该是:如果在 A 地用 Account1 登录之后,我再在 B 地用 Account1 登录,则 B 地登录成功,并且强制注销 A 地的登录状态。就是把 A “踢”出系统。目前QQ不就是这样做的吗?这样的做法可以是:
服务器保存用户最后一次登录用的 cookie id 值。用户成功登录之后,将自己的 cookie id 值保存到这个用户信息中。如果用户在访问其它页面时,检查用户当前的 cookie id 是否和系统中保存的 cookie id 值,如果系统中的 cookie id 值为空(从来没有登录)或者不相同(已经有人从其它地方登录了),则自动注销,跳转到登录页面。
我所知道的,常用的也就两种:
1、application,这个是全局共享的,所以用户登录后把相关的信息保存后,登录的时候再验证,就能做到一个账户只允许一人登录的需要。
2、在数据库里给用户表增加一个登录状态的字段。
当有用户成功登录进来时,到了主页面了,实现代码
function showMsg() {
$.ajax({
type: "post",
url: "../../../asyn/OnlineUser.aspx?flag=0&data=" + new Date().getTime(),
beforeSend: function () {
},
success: function (data) {
},
error: function () {
// alert("出错");
}
});
}
setInterval("showMsg()", 6000);
以上代码是每隔一段时间去异步请求下后台,后台处理代码(这里写得比较简单,主要是思路),
int UserId = Session["UserID"] == null ? 0 : Convert.ToInt32(Session["UserID"]);
if (UserId > 0 && UserName != "")
{
//这里是Dictionary<long,UserModel>里存在的,把时间更新更新到最新
if (UserManager.dic.ContainsKey(UserId))
{
//时间更新
UserManager.Update(UserId, DateTime.Now);
}
else //这里是新进来的用户添加到Dictionary<long, UserModel>
{
UserModel model = new UserModel();
model.UserID = UserId;
model.UserName = UserName;
model.LastActionTime = DateTime.Now;
model.DempName = DepartmentName; model.SessionId = Session.SessionID;
UserManager.Add(UserId, model);
}
}到了这里应该可以看得差不多了,就是当前登录成功的用户保存到全局的Dictionary<long,UserModel>
,当有用户退出时,删除掉,或者session失效时,删除掉,
在登录的时候,做下判断
if (UserManager.dic.ContainsKey(UserId_Dic))
{
DsCommon.PublicFunction.RegistScript(this.Page, "alert('当前用户处于登录状态,无法重复登录!');");
return;
}
这里要说明的是一个实现思路,有思路就好办了,代码不重要,这些代码也不够,还有很多没提到问题,自己在开发的时候会发现
搞心跳包是找死,如果网速慢点,心跳没有跟上咋办,让我重新登陆吗?
写入字段,完全是个SB的作法,脑子里面进面粉了吗?明显不靠谱吗,还用脑子想吗?
还有用IP的,如果是网吧内,或局域网内咋处理,换个机器后就不让我上了吗?