通过 AJAX 调用创建后 Symfony 2 会话不持久

Posted

技术标签:

【中文标题】通过 AJAX 调用创建后 Symfony 2 会话不持久【英文标题】:Symfony 2 sessions not persisting after created via AJAX call 【发布时间】:2012-09-16 02:01:16 【问题描述】:

让我给你一个场景。我有一个调用 /auth 的 AJAX 调用 - 该页面依次检查用户是否经过身份验证并设置几个会话变量(下面的代码)。

$session = $this->getRequest()->getSession();

$session->set('fbid', $fbid);
$session->set('name', $name);

// not sure if this is even needed - get the same with or without
//$session->save();

现在,如果我转到另一个页面并尝试访问该会话,它会返回为空。

如果我在常规页面上设置这些会话(不是通过 XMLHttpRequest/AJAX 访问的页面),它工作正常。

这是我在config.yml 中的会话设置:

session:         
    cookie_lifetime:         3600
    cookie_httponly:         false

我以为问题可能出在httponly,但事实并非如此。

有什么建议吗?我错过了什么吗?

* 更新 *

这是我的安全/防火墙设置:

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login:
        pattern:  ^/demo/secured/login$
        security: false

    secured_area:
        pattern:    ^/demo/secured/
        form_login:
            check_path: /demo/secured/login_check
            login_path: /demo/secured/login
        logout:
            path:   /demo/secured/logout
            target: /demo/

我根本没有更改防火墙设置,据我所知,它不应该影响通过 XMLHttpRequest 调用/auth

* 更新 2 *

我最终在 2 组之后添加了 $session->shutdown()(是的,我知道关闭不是 Session 对象方法)。它最终得到了一个错误,但正因为如此它开始工作并且它实际上将它保存到 $_SESSION。因此,如果该错误迫使它保存到 $_SESSION,则必须有一个实际的方法来强制保存。真奇怪..

【问题讨论】:

您的 AJAX 路由是否与安全防火墙模式匹配? 我刚刚将我的防火墙设置添加到问题中,据我所知,它不匹配。 我认为这与 Symfony 2 出于某种原因实际上没有将会话数据写入 $_SESSION 有关。有什么办法强制它写吗? 啊,很抱歉造成混乱。它与安全无关。 您检查过这些链接吗? First 和 second 【参考方案1】:

我发现了问题所在。

第一个会话是在生产环境中创建的(通过 AJAX / XMLHttpRequest 调用的操作),而我测试它的下一页实际上是在开发环境中。当时,我从未想过 Symfony 2 实际上是在不同的位置保存 prod 和 dev 的会话 - php 通常有一个默认位置,它会保存所有会话。

Symfony 2 覆盖了默认的 session.save_path 并为每个设置了自己的 - 不幸的是,在我发现这一点之前浪费了一天。

还写了一篇文章,所以其他人不必遇到同样的问题。

http://jondev.net/articles/Reasons_why_Symfony_2_sessions_might_not_always_persist

【讨论】:

谢谢!我一直在拼命想弄清楚。 文章在哪里? web.archive.org/web/20160630020209/http://jondev.net/articles/…

以上是关于通过 AJAX 调用创建后 Symfony 2 会话不持久的主要内容,如果未能解决你的问题,请参考以下文章

在 ajax 提交时禁用 symfony 2 csrf 令牌保护

带有 CSRF 的 Symfony2 表单通过 JQuery AJAX 传递

Ajax 调用 Symfony 控制器

Symfony2,检查一个动作是不是被ajax调用

Symfony2,检查一个动作是不是被ajax调用

如何为 Symfony3 上的 AJAX 调用添加 CSRF 保护?