【问题标题】:Reading a cookie with jquery that was set by PHP使用 PHP 设置的 jquery 读取 cookie
【发布时间】:2018-03-20 05:44:50
【问题描述】:

我正在尝试在 PHP 中设置一个 cookie,然后让我的 JavaScript/jQuery 读取它。当我一直在尝试研究这个问题时,我看到有些人谈论服务器端与客户端 cookie,而其他人则说 cookie 只是 cookie,没有区别。我所知道的是 PHP 会看到 cookie,而 JavaScript 不会。

这是构建页面和设置 cookie 的 PHP 文件的简化版本。

<!DOCTYPE html>
<?php 
    setcookie("card", "", time()+900, '/');
?>
<html>
<body>
       <?php 
            $card = "a string I want in my cookie";
            $_COOKIE['card'] = $card;

            foreach($_COOKIE as $c => $c_value)
            {
                echo "Cookie named " . $c . " has value " . $c_value . "<br/>";
            }
        ?>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/jquery.cookie@1.4.1/jquery.cookie.min.js"></script>
    <script type = "text/javascript" src = "script.js"></script>
</body>
</html>

这将在我的页面上正确显示 cookie 的名称和值。所以我知道我正在设置一些东西。

但是当我的 JavaScript 运行时,我似乎没有任何 cookie。我尝试了几种不同的方法来获取所有 cookie 的值,或者只是 cookie 的单个目标部分:

var all_cookies = document.cookie;
var aCard = $.cookie('card');

all_cookies 在我调试时显示为“”,而 aCard 只是保持未定义。

那么我需要用 PHP 以不同的方式设置 cookie 吗?或者使用 JavaScript 或 jQuery 以不同的方式阅读它们?

【问题讨论】:

  • 检查该页面的请求,看看它是否有标题“HttpOnly”。
  • 服务器端和客户端技术都可以读取cookie,但cookie被标记为httponly。也许你有一些设置使cookies httponly 例如php_flag session.cookie_httponly on in .htaccess
  • 您正在使用 setcookie 设置一个空值。分配给超级全局 $_COOKIE 对客户端没有影响。事实上,分配 any 超级全局应该是没有必要的。

标签: javascript php jquery cookies


【解决方案1】:

PHP 的setcookie() 函数设置一个HTTP 响应标头,指示浏览器设置cookie。这只有在您尚未发送任何输出时才有可能。 之后调用setcookie(),您已经输出了&lt;!DOCTYPE,这意味着您应该收到“无法修改标头信息 - 标头已发送”警告。

要设置 cookie 并使其可用于 Javascript,您需要在生成任何输出之前在脚本的最开头设置它:

<?php
    $card = "a string I want in my cookie";
    setcookie("card", $card, time()+900, '/');

    // note from the manual (https://php.net/setcookie):
    //     Once the cookies have been set, they can be accessed
    //     on the next page load with the $_COOKIE array.
    //     ^^^^^^^^^^^^^^^^^^^^^
    //
    // so the "card" cookie won't be in $_COOKIE until
    // the next page load. If you want it in there
    // immediately, you need to set it manually:

    $_COOKIE['card'] = $card;
?>
<!DOCTYPE html>
<html>
<body>
       <?php 
            foreach($_COOKIE as $c => $c_value)
            {
                echo "Cookie named " . $c . " has value " . $c_value . "<br/>";
            }
        ?>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/jquery.cookie@1.4.1/jquery.cookie.min.js"></script>
    <script type = "text/javascript" src = "script.js"></script>
</body>
</html>

现在您已经在生成任何输出之前使用了setcookie(),cookie 已正确设置,Javascript 应该能够从 document.cookie 访问它而不会遇到任何问题。

【讨论】:

  • 谢谢,这很有帮助,因为我可能无法做我想做的事。在页面顶部声明 cookie 的值确实允许 JavaScript 获取它(但是它只需要在 标记之上而不是 标记之上)。不幸的是,我试图做的事情需要稍后设置 cookie 的值,所以我可能需要尝试另一种方法,因为这似乎不可行。
猜你喜欢
  • 2014-07-18
  • 2023-03-17
  • 2012-11-20
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多