一次只允许一个会话

时间:2010-07-02 09:23:51

标签: apache2 php

我想让我的网站一次只允许一个会话。例如,假设用户在firefox上登录我的网站,如果用户再次登录到同一计算机或不同计算机上的Opera之类的其他浏览器,则firefox上的会话将被销毁。然而,如果仍然是一个会话,Firefox上的会话仍然存在。我可以知道我该怎么办?我正在使用php和apache。谢谢。

的问候。 本杰明

6 个答案:

答案 0 :(得分:10)

我建议你做这样的事情:

假设用户“A”第一次进入“Com_1”。针对该会话在数据库中保存唯一代码,与用户会话相同。

同时,如果他(用户“A”)再次登上“com_2”,则检查他在数据库中的状态并更新数据库中的唯一代码。

如果同一个用户(用户“A”)刷新“com_1”页面,请再次返回,我们所要做的就是检查会话中的唯一代码并将其与数据库匹配,确定它不会匹配,然后注销并销毁会话。

为了保持用户登录,即使浏览器已关闭,您也可以将cookie存储在浏览器中,并相应地重新生成会话。

希望这会有所帮助。谢谢。

答案 1 :(得分:5)

您可以使用以下算法

  1. 在数据库userLoggedInCount
  2. 中创建一个整数字段
  3. 在每个登录增量上标记并将结果存储在会话中。
  4. 在每个请求中检查数据库中的值和会话中的值,如果会话中的值小于数据库中的值,则invalidate()会话并递减数据库中的值< / LI>
  5. 每当会话被销毁时,也会减少该值
  6. Bozho的信用因为他发布了这个,回答了一个问题 here

答案 2 :(得分:3)

保留当前登录的中央数据库表或文本文件。如果用户已在另一个会话中登录,则通过将“登录”标志设置为false来使该会话无效。

答案 3 :(得分:3)

我认为你必须做那样的事情:

  • 将“last_session_id”列添加到您的用户表
  • 当用户登录时,使用其当前会话ID更新其last_session_id字段
  • 在每个页面上,如果用户具有经过身份验证的会话,请检查会话ID是否等于数据库中记录的会话ID。如果没有,请销毁此会话。

答案 4 :(得分:1)

将会话ID存储在数据库中。从数据库检索上次登录会话ID,使用<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;netcoreapp2.1;net45</TargetFrameworks> <Version>1.0.11</Version> </PropertyGroup> <ItemGroup> <None Update="XSD\V202001\Voorbeeld\Common.xsd" Pack="true"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> <None Update="XSD\V202001\Voorbeeld\Specific.xsd"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> <ItemGroup> <Content Include="XSD/**/*.*" copyToOutput="true"> <IncludeInPackage>true</IncludeInPackage> <CopyToOutput>true</CopyToOutput> <BuildAction>none</BuildAction> <copyToOutput>true</copyToOutput> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> <ItemGroup> <Content Include="tools\install.ps1"> <PackagePath>tools\</PackagePath> </Content> </ItemGroup> </Project> 设置会话ID,并更改与身份验证相关的会话变量,例如session_id(oldid) 并销毁会话并使用新的会话ID创建新会话。遵循逻辑https://www.php.net/manual/en/function.session-create-id.php的示例。 这将允许最后一次登录。在每个页面上验证会话变量相关的身份验证。这会导致会话无效,因为通过新登录名对此$_SESSION['LOGIN']进行了重置。

答案 5 :(得分:0)

在数据库中保存用户的IP =&gt; SESSION_ID对。当用户尝试加载您的页面时,您必须比较实际的IP =&gt; SESSION_ID对,然后允许/拒绝该对是否正确/不同。