大家好,我只是有一个问题,
在localhost中我有几个系统,当我打开2个或更多系统时,我登录第一个系统,然后另一个系统还没有会话。
但是当我退出其中一个时,所有会话都被销毁了。这是正常的吗? 或者它是一种漏洞?
当您在同一服务器(例如localhost)中销毁某个会话时,它会破坏其中的其他会话吗?
http://localhost/system1 Active Session $_SESSION['admin']
http://localhost/system2 Active Session $_SESSION['admin']
我使用session_destroy()注销http://localhost/system1,然后结果为
http://localhost/system1 Inactive Session
http://localhost/system2 Inactive Session
任何帮助表示赞赏!感谢
答案 0 :(得分:2)
如果两个系统都使用相同的会话ID(换句话说,它意味着相同的会话文件/实体),那么是的,这是正常的。因为实际上只有一个会话包含来自少数系统的数据。
您的系统可以使用不同的会话,但为此您需要手动生成会话ID(请查看http://php.net/manual/en/function.session-create-id.php和http://php.net/manual/en/function.setcookie.php以了解如何更改Cookie路径)。
在您的情况下,最简单的解决方案是从会话中取消设置系统数据(在注销时),然后不会删除其他系统数据。
答案 1 :(得分:1)
为主机而不是子文件夹设置会话。 创建会话时,会在 localhost 上创建会话, 现在,会话变量可以由system1和system2访问,
使用 session_destroy(); 会破坏主机的会话。所以删除所有会话引用。
我认为您希望特别取消设置特定网站的变量。所以用这个。
unset($_SESSION['system1session']);
希望有所帮助
答案 2 :(得分:1)
会话在主机上销毁,
如果您使用的是Apache,则可以使用虚拟主机创建本地域。然后访问example.local或example2.local
上的每个站点<VirtualHost *:80>
DocumentRoot "/www/example1"
ServerName www.example.local
# Other directives here
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/www/example2"
ServerName www.example2.local
# Other directives here
</VirtualHost>
有关此内容的更多信息:https://httpd.apache.org/docs/current/vhosts/examples.html
或者您可以尝试使用PHP内置Web服务器,在一个文件夹的Web根目录中运行php -S localhost:8000
,在另一个文件夹中运行php -S localhost:8001
。然后,您可以在http://localhost:8000和http://localhost:8001上访问它们。虽然没有测试过这个。
http://php.net/manual/en/features.commandline.webserver.php
另一种选择是使用命名会话http://php.net/manual/en/function.session-name.php
答案 3 :(得分:1)
您可以为每个会话使用不同的名称。
PHP有一个会话名称功能,它指定Cookie的名称,因此两个不同的名称将具有自己的范围和ID。
一个文件:
session_name("ServerApp1"):;
session_start();
$_SESSION["a"] = ...
其他档案:
session_name("ServerApp2"):;
session_start();
$_SESSION["a"] = ...
使用这种方法,您可以在一个文件中销毁Session,而另一个文件则不受影响。