从第二台计算机删除会话值

时间:2012-10-28 15:48:22

标签: php session

我创建了一个登录我的网站。用户登录后,我将用户ID和操作(=登录)存储在数据库中,$ _SESSION ['loggedin'] == TRUE。 (如果注销,DB中的操作将被注销,会话将被销毁) 如果有人想从第二台计算机再次使用相同的用户名登录,我将不允许它,因为数据库中的最后一行是“登录”,当然用户ID也是一样的。所以我不想允许一个用户名的多个连接。 现在我想在此处输入一个链接:“断开其他连接”。

例如:我登录了学校,但是我忘了退出,然后我尝试在家登录但是因为我登录(会话还活着)另一个地方会失败,所以如果我点击“断开其他连接“链接我想删除学校中的会话值(更改DB中的操作值是不够的,因为如果我将其更改为Logged out,则会话仍处于活动状态,并且可以使用多个连接)

如何阻止来自一个用户名的多重连接?

2 个答案:

答案 0 :(得分:1)

听起来你需要做的就是保存一些东西来识别各个连接,比如说每次帐户登录时你都会加一个号码。

例如,假设您使用ID为1的用户登录,这是您第五次登录,因此您将其保存到数据库: UserID = 1,State =“Logged In”,ConnectionID = 5 到您保存的会话: $ _SESSION ['loggedin'] = TRUE和$ _SESSION ['ConnectionID'] = 5

当您下次登录时检查是否存在尚未注销的帐户的连接,如果是这种情况,您可以更新现有行以将状态设置为已注销,或者如果您要日志时间创建一个新条目,状态为已注销(UserID = 1,State =“Logged Out”,ConnectionID = 5),当然您还为新连接插入了一行,连接6。

之后,您需要的是在您的站点上运行代码,可能是每次页面加载时检查数据库中是否存在与您在$ _SESSION中保存的ConnectionID相同的任何行如果他们将操作设置为已注销,如果是这种情况,则会销毁将记录先前连接的会话。

希望这能让您对如何做到这一点有所了解。我相信还有其他选择。

如果您只关心一个帐户只是从一个地方登录而您对登录时不感兴趣,那么您可以将UserID和ConnectionID保存到数据库然后只检查ConnectionID在数据库中与会话中的相同,如果没有,则会终止会话。

答案 1 :(得分:0)

唯一不那么可靠的方法是检查IP地址,当用户在NAT网关(例如,蜂窝数据连接,家庭路由器等......)后面时,这会严重失败。如果用户在先前打开的会话中再次通过登录序列,则最好的办法是简单地删除任何现有会话。

的内容

login.php:

<?

check_password_stuff();

if (user_is_already_logged_in()) {
   delete_login();
}
do_login_stuff();