代码之家  ›  专栏  ›  技术社区  ›  xil3

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

  •  4
  • xil3  · 技术社区  · 12 年前

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

    $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/AAJAX访问的页面)上设置这些会话,它就可以正常工作。

    以下是我在中的会话设置 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/
    

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

    *更新2*

    我最后添加了 $session->shutdown() 在两个集合之后(是的,我知道shutdown不是Session对象方法)。它最终出现了一个错误,但正因为如此,它才开始工作,并将其保存到$_SESSION。因此,如果该错误迫使它保存到$_SESSION,那么必须有一个实际的方法来强制保存。真奇怪。。

    1 回复  |  直到 12 年前
        1
  •  10
  •   xil3    12 年前

    我弄清楚问题出在哪里了。

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