如何在不回显的情况下将会话值获取到客户端


how to get session value to client-side without echo it out

我想在js中使用session['something']值,如果我不把它打印出来怎么办,我怎么能使用这个值呢?

我只找到了两种方法1) 使用隐藏字段技巧2) ajax

注意:我有一个"巨大"的会话数据,因为它是一个数组

更新:我已经在index.php中设置了会话,我想在js文件中使用数组(会话)

客户端不可能直接访问任何$_SESSION变量,因此如果您不能或不想在JS中回显变量的内容,则只有两个选项可用。

将其直接放入JavaScript中。JSON"字符串"是完全可解析的JavaScript,这就是为什么可以eval(jsonStr);并获得与JSON.parse(jsonStr)相同的东西(尽管出于安全原因不鼓励使用eval)。如果嵌套的_SESSION数据是安全的(例如,已经为JS进行了清理),那么以下内容没有错:

<script type="text/javascript">
var session = <?php echo json_encode($_SESSION); ?>;
</script>

稍后。。。

<script type="text/javascript">
$(document).ready(function() {
    doSomething(session);
}
</script>

您可能不希望将整个会话转储到客户端,在这种情况下,只需重新构建您想要的内容(如果您意识到这一点,也可以在此处显示CDATA的示例,因为它位于XHTML树中):

<?php
$jsOut['username'] = $_SESSION['username'];
$jsOut['public'] = $_SESSION['public'];
// omit $_SESSION['passhash']
$encodedJSON = json_encode($jsOut);
?>
<script type="text/javascript">
//<![CDATA[
var session = <?php echo $encodedJSON; ?>;
//]]>
</script>

您可以将<script>标记放在HTML的主体/头部(即CDATA)。它可以简单到在全局范围或命名空间范围中声明一个对象。然后只需访问中的对象(无论您用var声明它的名称是什么),将它传递到一些"init"函数中,该函数可以位于页面中包含/加载的任何JS文件中(即外部或内联)。

记住,PHP只是您想要生成的任何内容的准备程序(因此得名)。在这种情况下,您生成的客户端代码可以由HTML、CSS、甚至JS或任何其他客户端技术(例如IE的VBScript)组成。见鬼,如果你愿意,PHP甚至可以动态地编写JavaScript,这是这个解决方案推荐的最简单的形式。

如果您需要表示层中的会话数据进行连续访问,那么您有两个方法,并且您已经提到了它们。

  1. 将所有数据转储到JavaScript数组中,然后使用它
  2. 使用AJAX并从服务器获取它

如果您使用的是MVC框架,您可以编写一个单独的控制器,它为您提供访问SESSION数据的不同方法。这样你就不会一次公开所有的数据,并且可以编写组织代码。