【问题标题】:Laravel Cookie Not Showing Up Via JavascriptLaravel Cookie 未通过 Javascript 显示
【发布时间】:2014-09-15 19:33:09
【问题描述】:

我是学习 laravel 的新手,我的路由文件中有以下内容::

Route::get("/setcookie", function(){
    $cookie = Cookie::make("low-carb","almond cookie",30);
    return Redirect::to("getcookie")->withCookie($cookie);
});

Route::get("/getcookie", function(){
    $cookie = Cookie::get("low-carb");
    return View::make("getcookie")->withCookie($cookie);
});

我设置了一个 cookie 并重定向到另一个页面。我希望能够在视图页面中通过 javascript 对话框显示 cookie。 “getcookie”视图页面如下所示::

<html>
<body>
this is the cookie page
<script language="javascript">
    window.onload = showCookies;

    function showCookies(){

        alert("Cookie is: " + document.cookie);
       }

</script>
</body>
</html>

我在弹出对话框中看到的唯一内容是“Cookie is”。我期望的值没有出现。

我肯定知道这做错了,因为当我在 chrome 开发人员工具中检查 cookie 时,我看到“setcookie”路由,键 REQUEST COOKIE 和 RESPONSE_COOKIE(laravel_session 和低碳水化合物)都有值,但它被重定向到的“getcookie”路由,chrome 中的 REQUEST COOKIE 键同时具有“laravel_session 和 low-carb”,但 RESPONSE_COOKIE 键只有“laravel_session”,并且缺少“low-carb”键值。

我做错了什么?

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    默认情况下,Laravel cookie 被标记为 httponly - 这意味着它们不能通过 JS 访问。这通常是您想要的,因此它是默认设置。

    如果您查看此处的源代码:https://github.com/laravel/framework/blob/master/src/Illuminate/Cookie/CookieJar.php#L41,您会看到方法签名如下所示:

    public function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true)
    

    传入的最后一个变量是 httpOnly 变量。

    所以,如果你改变:

    Cookie::make("low-carb","almond cookie",30);
    

    Cookie::make("low-carb","almond cookie",30, null, null, false, false);
    

    那么你的cookie就不会被标记为httponly,而是可以通过JS访问。

    您可以使用浏览器开发工具检查 cookie 是否为 httponly,在 Chrome 的开发工具中转到资源,然后转到 Cookies,然后转到 oyur 域,该表中有一个名为 HTTP 的列 - 它有一个勾选该 cookie 是否仅限 HTTP。

    编辑:所有 cookie 都在 Laravel 中加密和签名,因此用户无法篡改它们。个人对此不是 100% - $_SESSION 用于用户无法编辑的持久数据,$_COOKIE 用于您希望用户能够阅读和编辑的数据。反正就用 PHP 的原生吧:

    setcookie("low-carb", "almond cookie", time()+(30*60));
    

    如果你想这样做,而不是 laravel 方法。

    您可能还想考虑是否有“更好”的方法来处理这个问题 - 也许您无论如何都不需要 Cookie(请记住,它们是与匹配 cookie 路径、CSS、JS、图片,字体 - 一切)

    【讨论】:

    • 感谢您的回答。 cookie 的值看起来不同。是不是意味着它被加密了?
    • 啊,是的,从 4.1 开始,它们默认是加密的。来自文档:“由 Laravel 框架创建的所有 cookie 都经过加密并使用身份验证代码签名,这意味着如果它们已被客户端更改,它们将被视为无效。”
    • Cookie::make("low-carb","almond cookie",30, null, null, false, false);对我不起作用,我可以通过将其添加到 EncryptCookies.php 异常来使其不加密,但是仍然无法通过 javascript 访问它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2014-04-25
    • 2020-09-03
    相关资源
    最近更新 更多