如何从Symfony2访问jquery中的cookie

时间:2012-04-25 06:19:07

标签: jquery cookies symfony

所以我希望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。

有人可以帮助我吗?

2 个答案:

答案 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;