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

xil*_*il3 4 php ajax session symfony symfony-2.1

让我给你一个场景.我有一个调用/ 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();
Run Code Online (Sandbox Code Playgroud)

现在,如果我转到另一个页面并尝试访问该会话,它将返回空白状态.

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

以下是我的会话设置config.yml:

session:         
    cookie_lifetime:         3600
    cookie_httponly:         false
Run Code Online (Sandbox Code Playgroud)

我认为问题可能已经存在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/
Run Code Online (Sandbox Code Playgroud)

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

*更新2*

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

xil*_*il3 10

我弄清楚问题是什么.

第一个会话是在生产环境(通过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