Laravel Cookie没有通过Javascript显示

Edd*_*man 2 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);
});
Run Code Online (Sandbox Code Playgroud)

我设置了一个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>
Run Code Online (Sandbox Code Playgroud)

我在弹出对话框中看到的唯一一件事就是"Cookie is".我期待的价值没有显现出来.

我肯定知道我做错了什么因为当我检查chrome开发工具中的cookie时,我看到"setcookie"路线,REQUEST COOKIE和RESPONSE_COOKIE(laravel_session和low-carb)这两个键都有值但是对于"getcookie" "重定向到的路径,chrome中的REQUEST COOKIE键同时具有"laravel_session和low-carb",但RESPONSE_COOKIE键只有"laravel_session",并且"low-carb"键值丢失.

我究竟做错了什么?

Ric*_*haw 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)
Run Code Online (Sandbox Code Playgroud)

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

所以,如果你改变:

Cookie::make("low-carb","almond cookie",30);
Run Code Online (Sandbox Code Playgroud)

Cookie::make("low-carb","almond cookie",30, null, null, false, false);
Run Code Online (Sandbox Code Playgroud)

然后您的cookie将不会被标记为httponly,并且可以通过JS访问.

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

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

setcookie("low-carb", "almond cookie", time()+(30*60));
Run Code Online (Sandbox Code Playgroud)

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

您可能还想考虑是否有一种"更好"的方式来处理这个问题 - 也许您不需要使用Cookie(请记住,它们会随着与cookie的路径,CSS,JS,图像,字体相匹配的每个请求发送 - 一切)