我想让我的网站一次只允许一个会话。例如,假设用户在firefox上登录我的网站,如果用户再次登录到同一计算机或不同计算机上的Opera之类的其他浏览器,则firefox上的会话将被销毁。然而,如果仍然是一个会话,Firefox上的会话仍然存在。我可以知道我该怎么办?我正在使用php和apache。谢谢。
的问候。 本杰明
答案 0 :(得分:10)
我建议你做这样的事情:
假设用户“A”第一次进入“Com_1”。针对该会话在数据库中保存唯一代码,与用户会话相同。
同时,如果他(用户“A”)再次登上“com_2”,则检查他在数据库中的状态并更新数据库中的唯一代码。
如果同一个用户(用户“A”)刷新“com_1”页面,请再次返回,我们所要做的就是检查会话中的唯一代码并将其与数据库匹配,确定它不会匹配,然后注销并销毁会话。
为了保持用户登录,即使浏览器已关闭,您也可以将cookie存储在浏览器中,并相应地重新生成会话。
希望这会有所帮助。谢谢。
答案 1 :(得分:5)
您可以使用以下算法
invalidate()
会话并递减数据库中的值< / LI>
Bozho的信用因为他发布了这个,回答了一个问题 here
答案 2 :(得分:3)
保留当前登录的中央数据库表或文本文件。如果用户已在另一个会话中登录,则通过将“登录”标志设置为false来使该会话无效。
答案 3 :(得分:3)
我认为你必须做那样的事情:
答案 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对,然后允许/拒绝该对是否正确/不同。