2

因此,我希望 Symfony2 中的控制器设置一个 cookie,然后如果该 cookie 已设置,则让一个 jquery 脚本相应地采取行动。这似乎很简单,但由于我无法让它工作,我想我会问。

这是我设置 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。

有谁可以帮我离开这里吗?

4

2 回答 2

6

如果您查看setCookie 方法的文档,则有一个名为的参数httponly,它确定 cookie 变量是否可供 javascript 访问。在 Symfony2 中默认为 true。您必须将其设置为假,例如

    $response->headers->setCookie(new Cookie('showhelp', 'true', time() + (3600 * 48), '/', null, false, false));
于 2012-04-25T11:00:27.877 回答
1

检查setcookie 函数中的最后一个参数。httponly默认设置为 false。

从手册:

当 TRUE 时,cookie 将只能通过 HTTP 协议访问。这意味着 cookie 将无法通过 JavaScript 等脚本语言访问。有人建议,此设置可以有效地帮助减少通过 XSS 攻击进行的身份盗用(尽管并非所有浏览器都支持),但这种说法经常引起争议。在 PHP 5.2.0 中添加。对或错

在 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;
于 2012-07-15T11:22:31.150 回答