所以我希望Symfony2中的控制器设置一个cookie,然后让jquery脚本相应地动作,如果已经设置了cookie。这似乎很简单,但由于我无法让它工作,我想我会问。
以下是我设置cookie的Symfony代码:
// in controller
$url = $this->container->get('router')->generate('_fs_feed_show');
$response = new RedirectResponse($url);
$response->headers->setCookie(new Cookie('showhelp', 'true', time() + (3600 * 48)));
return $response;
这是我的jquery代码片段(我正在使用cookie插件)
if ($.cookie('showhelp') != null) {
alert('cookie set!');
}
我也试过了:
if ($.cookie('showhelp', {path: '/'}) != null) {
alert('cookie set!');
}
我正在使用chrome并使用“chromekie”扩展程序,我可以看到已设置cookie。当我单步执行javascript调试器时,if语句的计算结果为false。
有人可以帮助我吗?
答案 0 :(得分:6)
如果查看setCookie方法的文档,会有一个名为httponly
的参数,它确定cookie变量是否可以被javascript访问。在Symfony2中,默认情况下为true。你必须把它设置为假,例如
$response->headers->setCookie(new Cookie('showhelp', 'true', time() + (3600 * 48), '/', null, false, false));
答案 1 :(得分:1)
检查setcookie function中的最后一个参数。默认情况下, httponly 设置为false。
从手册:
当为TRUE时,cookie只能通过HTTP协议访问。这意味着脚本语言(例如JavaScript)无法访问cookie。有人建议这种设置可以通过XSS攻击有效地帮助减少身份盗用(尽管并非所有浏览器都支持),但这种说法经常受到质疑。在PHP 5.2.0中添加。 TRUE或FALSE
在Symfony2源代码(v2.0.12)中,它说
//Symfony\Component\HttpFoundation\Cookie
public function __construct(
$name,
$value = null,
$expire = 0,
$path = '/',
$domain = null,
$secure = false,
$httpOnly = true
)
{
//...
}
默认情况下, $ httpOnly 参数为true。这就是为什么你不能用javascript访问你的cookie。
要解决此问题,您需要将控制器更改为:
// in controller
$url = $this->container->get('router')->generate('_fs_feed_show');
$response = new RedirectResponse($url);
$response->headers->setCookie(
new Cookie('showhelp', 'true', time() + (3600 * 48),'/',null,false,false)
);
return $response;