我是新手学习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;键值缺失。
我做错了什么?
答案 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,图像,字体 - 所有内容相匹配的每个请求发送)