如果在框架内点击,框架集/ PHP会丢失会话变量


Frameset / PHP loses session variable if clicking inside frame

我正在为我的网站使用框架(我知道不是最佳的,它计划在未来改变)

使用左边的导航,会话变量被正确传递。

然而,如果我点击打开一个新的页面从框架"content"并替换它,一个新的会话被创建。

我在每个页面的开头都有session_start(),也尝试使用标题解决方案,但是没有解决这个问题。如果我查看sessiondata文件夹,我看到在更改"内容"框架时,创建了一个新会话。

if(!isset($_SESSION))  {
session_start();·
}
header('P3P: CP="CAO PSA OUR"');

——框架:

<?php session_start();
if($_SESSION['email']==''){echo 'please login with your credentials';}else if($_SESSION['email']!='') {
    session_save_path('/var/www/home/path/sessiondata/');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html><head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Website Name.</title>
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Cache-Control" content="no-cache">
  <link rel="SHORTCUT ICON" href="http://domain.com/favico.ico" type="image/x-icon">
</head>

<frameset rows="11%,89%" frameborder="1" framespacing="1" topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" border="0" bordercolor="#ffffff">
  <frame name="bar" src="report/index1.php" frameborder="0" noresize="noresize" scrolling="no">
  <frameset id="mainset" cols="137,5,*" frameborder="0" framespacing="1" topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" border="0" bordercolor="#ffffff">
    <frame name="menu" src="report/index_002.php" frameborder="0" noresize="noresize">
    <frame name="function" src="report/index_003.php" frameborder="0" scrolling="no" marginwidth="0" marginheight="0" border="0" framespacing="0" noresize="noresize">
        <frame name="content" src="report/index_004.php" frameborder="0" noresize="noresize">
      </frameset>
  <noframes><body><p>This page uses frames, but your browser doesn't support them.</p></body></noframes>
</frameset>
</html>

<?php 
 session_start();
 if($_SESSION['email']==''){
      echo 'please login with your credentials';
 } else if($_SESSION['email']!='') {
      session_save_path('/var/www/home/path/sessiondata/');
?>

花点时间思考一下这段代码在做什么。Session_start()表示

  • 使用提供的会话令牌从默认位置检索会话数据
  • 创建一个会话id,然后在会话id
  • 标识的默认位置创建一个新会话

而session_save_path()表示将来对会话数据的任何读或写都将转到此位置,而不是默认位置。

因此,您的代码将永远不会检索经过身份验证的会话(因为session_save_path()在session_start()之后)。而且,巧合的是,您在这里描述的行为不能由您向我们展示的代码创建(这意味着其他地方或其他时间的不同代码已经与会话数据交互)。

当前唯一的解决方法是将会话id作为参数传递。奇怪的是,它对所有从左侧导航调用的其他页面都有效。

echo "<TD align='center'> <a href='http://domain.com/path/report/showt.php?option=$data&id=$iid&sess=$sessid' target='content'> Detail of $data</a></TD>'n";

在相应的文件showt。php中调用

<?php
$sessid= $_REQUEST['sess'];
session_id($sessid);
session_start();·
print_r($_SESSION);
header('P3P: CP="CAO PSA OUR"');
?>