我使用Laravel 4来开发我的应用程序。但我在设置cookie时遇到了一些问题。以下是app/routes.php
中的一些代码:
Route::get('/', function(){
// Set a cookie before a response has been created ??
Cookie::queue('test0', '123', 10);
$app = App::getFacadeApplication();
$version = $app::VERSION;
//Creating Custom Responses
$response = Response::make("<html><body>
Version: $version <br/>
<script type=\"text/javascript\">
document.write(document.cookie);
</script>
</body></html>", 200);
$response->withCookie(Cookie::make('test1', '0123', 10));
//Queue after response created
Cookie::queue('test2', '123', 10);
Cookie::queue('test3', '123', 10);
setcookie('test4', '123', time() + 60*10);
return $response->withCookie(Cookie::make('test5', '0123', 10));
});
但是当我运行此代码时,它并没有设置所有值。这是我的结果:
只有php内置函数有效,
任何其他功能,例如Cookie::queue
,withCookie
对我来说都不起作用,但在Cookies set by this page
弹出窗口中,如上图所示,它仍然具有所有Cookie值
那么,这里的问题是什么?
为什么test2
的值不是'123'
???
答案 0 :(得分:4)
这是因为您设置的Cookie为HttpOnly cookie。
HttpOnly cookies只能在通过HTTP传输时使用(或 HTTPS)。它们无法通过非HTTP API访问,例如 JavaScript的。这种限制减轻了,但并没有消除 通过跨站点脚本(XSS)威胁会话cookie被盗。 大多数现代浏览器都支持HttpOnly cookie。
Cookie::make()
方法有七个参数。您可以在laravel中将httpOnly
(默认为true)设置为false。
Cookie::make($name, $value, $minutes, $path, $domain, $secure, $httpOnly);
修改强>
在laravel中,为了安全起见,cookie值会自动使用密钥加密,该密钥在app/config/app.php
中设置。要获得您想要做的事情,您需要遵循以下两种方式:
只需在php中使用传统的setCookie方法。
setcookie($name, $value, $expire, $path, $host, $secure, $httpOnly);
否则,您可以使用这种棘手的方式。 Accessing unencrypted cookies
希望它对你有用。