我有两个基于PHP的应用程序,它们位于相同的父目录下。他们都安装了登录机制。我用来存储的会话变量在两个应用程序中都具有相同的名称。说,
$_SESSION["uid"]
现在当我从其中一个应用程序注销时(即基本上清除会话变量),它会自动清除另一个应用程序的会话变量。
如何防止这种情况发生?
答案 0 :(得分:0)
如果您在PHP中使用session_destroy();
,请知道session_destroy();
在调用$_SESSION
时删除所有变量。即使您的Web应用程序使用两个不同的变量名称,这些变量仍然在$_SESSION
中,在调用session_destroy();
时丢失。
我的建议是为您的$_SESSION
变量添加前缀,并为清除那些带前缀的$_SESSION
变量而不是调用session_destroy();
这可以通过在您的网络应用session_start();
之后添加以下内容来完成。
对于webapp 1:
// Web App 1
define("prefix", "WebApp1");
//SET YOUR SESSION VARIABLES LIKE THIS
$_SESSION[prefix.'authenticated'] = true;
对于webapp 2:
// Web App 2
define("prefix", "WebApp2");
//SET YOUR SESSION VARIABLES LIKE THIS
$_SESSION[prefix.'authenticated'] = true;
然后创建一个单独的函数来销毁我们的前缀会话变量而不是session_destroy();
function destroy_session($prefix){
foreach($_SESSION as $key => $value) {
if(preg_match('/^'.$prefix.'/', $value))
unset($_SESSION['key']);
}
}
然后在您的网络应用中调用此功能,而不是session_destroy();
destroy_session(prefix);
答案 1 :(得分:0)
您可以在开始会话之前设置两个应用的会话参数以及设置会话名称。这样,当你结束会话时,它只会影响其中一个。
代码看起来像 - APP1
$sessionName = session_name("appName1");
session_set_cookie_params(0, '/app1', '.domain.com');
session_start();
App2的
$sessionName = session_name("appName2");
session_set_cookie_params(0, '/app2', '.domain.com');
session_start();
有关上述功能的更多信息,请访问以下链接 - http://php.net/manual/en/function.session-name.php http://php.net/manual/en/function.session-set-cookie-params.php