Laravel Cookie没有通过Javascript显示

时间:2014-09-15 11:04:53

标签: php laravel laravel-4

我是新手学习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>

我在弹出对话框中看到的唯一内容是&#34; Cookie是&#34;。我期待的价值不会出现。

我肯定知道我做错了什么,因为当我检查Chrome开发工具中的cookie时,我会看到&#34; setcookie&#34;路线,钥匙REQUEST COOKIE和RESPONSE_COOKIE(laravel_session和low-carb)都有价值但是对于&#34; getcookie&#34;在重定向到的路线中,chrome中的REQUEST COOKIE键同时具有&#34; laravel_session和low-carb&#34;但是RESPONSE_COOKIE键只有&#34; laravel_session&#34;和#&#34;低碳水化合物&#34;键值缺失。

我做错了什么?

1 个答案:

答案 0 :(得分:7)

默认情况下,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访问。

您可以使用Chrome开发工具中的浏览器开发工具检查cookie是否为httponly,然后转到Cookies,然后转到Cookie,然后转到oyur域,该表中有一列名为HTTP - 如果cookie是HTTPonly,它有一个Tick。

编辑:所有Cookie都经过加密并在Laravel中签名,因此用户无法篡改它们。个人不是100% - $ _SESSION用于用户无法编辑的持久数据,$ _COOKIE用于您希望用户能够阅读和编辑的数据。无论如何,只需使用PHP的本机:

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

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

您可能还想考虑是否有更好的&#34;解决这个问题的方法 - 也许你根本不需要Cookie(请记住,它们会随着与cookie的路径,CSS,JS,图像,字体 - 所有内容相匹配的每个请求发送)