我在PHP 5.5.28上使用Symfony v3.0.6並啓用了OPcache。 網站管理員的安全性由FOSUserBundle管理。Symfony3來自同一個域的iframe的AJAX請求不會保存會話屬性
網站用戶訪問他們顯示非Symfony的形式在iframe從一個Ajax請求,簡單的Symfony行動同一個域的頁面:
public function validateAction(MailingList $mailingList, Request $request)
{
$email = $request->get('email');
$code = $request->get('code');
if ($mailingList->getCode() == $code) {
$response = new Response('', 200);
$securityManager = $this->get('security_manager');
$securityManager->grantAccess($request->getSession(), $mailingList, $email);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
$responseFailed = new Response('N2', 401);
$responseFailed->headers->set('Access-Control-Allow-Origin', '*');
return $responseFailed;
}
正如你可以看到我叫我的定製服務安全管理器,其中i屬性添加到會話:
public function grantAccess(Session $session, MailingList $mailingList, $email) {
$session->set('page_'.$mailingList->getId(),
json_encode(array(
0 => hash('sha256', $email.$mailingList->getCode()),
1 => $email
))
);
}
AJAX調用成功,整個頁面重新加載window.reload()
重新加載Symfony調試工具欄後,在之前的請求中未顯示任何屬性設置的跡象。 我也試過使用Cookies,但沒有成功。相同的模式仍然存在。
我想知道是否需要在其他控制器頁面調用getSession()方法,如下所示:'$ session = $ request-> getSession();'。我知道當我使用會話變量時,我必須在所有控制器上執行此操作。這可能不是解決方案,但你可以檢查。我不再使用會話變量,而是現在使用路由參數,因爲需要的編碼少得多,而且看起來更乾淨。 –
每次我需要使用'getSession'時都會調用它。它看起來像問題本身在於iframe和主頁有單獨的會話,我沒有找到一種方法來分享他們之間的東西。 –