2012-09-24 83 views
4

讓我給你這個場景。我有一個調用/ auth的AJAX調用 - 該頁面依次檢查用戶是否已通過身份驗證並設置了幾個會話變量(代碼如下)。通過AJAX調用創建Symfony 2會話後不會持續

$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,但是這並沒有做到這一點。

有什麼建議嗎?我錯過了什麼嗎?

* UPDATE *

這裏是我的安全/防火牆設置:

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,必須有一個實際的方法來強制保存。真奇怪......

+0

您的AJAX路線與安全防火牆模式匹配嗎? –

+0

我剛剛添加了我的防火牆設置的問題,從我可以告訴,它不符合它。 – xil3

+0

我認爲這與Symfony 2有關,因爲某些原因,實際上沒有將會話數據寫入$ _SESSION。有沒有辦法強制它寫? – xil3

回答

9

我想出了問題所在。

第一個會話是在生產環境(通過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

+0

謝謝!我一直在試圖弄清楚自己的腦袋。 –

+0

這篇文章在哪裏? – forsberg

+0

https://web.archive.org/web/20160630020209/http://jondev.net/articles/Reasons_why_Symfony_2_sessions_might_not_always_persist – xil3