我的应用程序我不希望同时登录相同的用户名,所以我有想法,但我不确定它是否正确。
1)当用户登录时,更新状态(db中用户表中的“isOnLine”列)并将其登录时间保存在会话中,如:
登录方法内:
DateTime ltime=Datetime.now();
Dbservice.executeSql(update User set(isOnLine,lastLoginTime) value("1",ltime));
Session["logintime"]=ltime;
当其他用户尝试登录时,请检查该表以查看该用户的状态是否已登录。如果是,请将“isOnline”设置为“0”,然后他就可以立即登录。
2)在每个受保护页面的Page_Onload()方法中,检查会话中的登录时间是否等于db中的时间:
string logtime=Dbservice.executeSelect("select lastLoginTime from user where xxxxx").Rows[0]["lastLoginTime"];
if(!Session["logintime"]==logtime){
//this user should offline now,redirect it to the login page
}
我想知道我的方式是否正确?
另外,我必须在每个受保护页面的Page_onLoad方法中编写检查逻辑,因此有很多重复代码,有什么想法可以避免这种情况吗?
由于我们网站中的所有页面都受到保护!。
感谢。
更新:
不允许两个用户同时在线,但允许具有正确密码的后一个用户可以强制前一个用户离线。例如:
user1登录“username = bill”和 “密码= 000”,然后他现在在线。
然后user2尝试登录 “username = bill”和 “password = 123”,因为他的密码是 无效,所以他的请求被拒绝。
user3尝试登录 “username = bill”和 “password = 000”,因为他的密码是 有效,所以他可以选择 user1离线。
在这种情况下,当后来的用户登录成功,但前用户的会话也存在时,我必须根据会话中的“登录时间”检查是否在线。
答案 0 :(得分:1)
如果您不打算使用Web场(或Web园)场景,则可以使用内存结构来跟踪已登录的用户。例如,字典类型的静态全局变量(以线程安全的方式访问)。
对于通用健壮的解决方案,您需要将此信息保存在数据库中(如您所示)。我还没有理解检查会话登录时间的目的。为了正确解决方案,
第三步(作业)是可选的,因为您可以修改#2中的检查以查看登录尝试是否在上次访问时间的n分钟(其中n>会话超时)之后。
答案 1 :(得分:0)
对于检查用户是否已在线的逻辑,我可能希望将其置于Global.asax Application_AcquireRequestState
事件中,因为所有页面都受到保护。