2015-11-24 54 views
1

當我嘗試在Symfony2中我會支持,以徹底清除 註銷,但如果我點擊瀏覽器的後退按鈕,我可以得到我前一交易日我不能退出後,要清除我的會議Symfony2的

firewalls: 
    main: 
     pattern: /.* 
     form_login: 
      login_path: /login 
      check_path: /login_check 
      default_target_path: /hrs/applyleave/ 
     logout: 
      path: /logout 
      target: /login 
      path: security_admin_logout 
      target: security_admin_login 
      invalidate_session: true 
      delete_cookie:~ 
     security: true 
     anonymous: true 

有什麼我失蹤?

+0

不註銷必須在防火牆的後面?當你點擊瀏覽器然後刷新頁面時會發生什麼? –

+0

註銷後,如果我點擊瀏覽器後退按鈕我可以回到 相同的頁面,但如果我刷新它註銷我 但我想它不應該讓我回到第一位! –

回答

0

您需要設置高速緩存控制指令不從瀏覽器緩存加載頁面:

$response = new Symfony\Component\HttpFoundation\Response(); 
    $response->setContent($this->renderView(YOUR_VIEW)); 
    $response->headers->addCacheControlDirective('no-cache', true); 
    $response->headers->addCacheControlDirective('max-age', 0); 
    $response->headers->addCacheControlDirective('must-revalidate', true); 
    $response->headers->addCacheControlDirective('no-store', true); 
+1

非常感謝!我會試一試,看看 但我在哪裏把這個片段放在註銷路線 或其他地方.... –

+0

我想你需要添加一個鉤子,在每個控制器之後執行。從Symfony的文檔中檢查http://symfony.com/doc/current/cookbook/event_dispatcher/before_after_filters.html#after-filters-with-the-kernel-response-event。 –

5

我最近碰到這個小問題來了,與一對夫婦的帖子的幫助下,我想出了以下解。

要在此處說明問題,註銷安全區域後,我們希望通過單擊後退按鈕來防止再次查看任何受保護的先前頁面。爲此,這些先前的頁面不得存儲在客戶端緩存中。我們需要攔截每個Symfony頁面響應,檢查它是否爲受保護的頁面,如果是,請將標題設置爲返回no-cache。

步驟一,建立一個響應監聽器類:

namespace AppBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 

class ResponseListener 
{ 
    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     $request = $event->getRequest(); 

     if ($this->disableThisPageCache($request->getPathInfo())) { 
      $headers = $event->getResponse()->headers; 
      $headers->set('Cache-Control', 'no-cache, no-store, must-revalidate'); // HTTP 1.1. 
      $headers->set('Pragma', 'no-cache'); // HTTP 1.0. 
      $headers->set('Expires', '0'); // Proxies. 
     } 
    } 

    private function disableThisPageCache($currentPath) 
    { 
     $paths = array('/admin', '/customer'); 

     foreach ($paths as $path) { 
      if ($this->checkPathBegins($currentPath, $path)) { 
       return true; 
      } 
     } 

     return false; 
    } 

    private function checkPathBegins($path, $string) 
    { 
     return substr($path, 0, strlen($string)) === $string; 
    } 
} 

步驟2,它註冊爲一個服務:

app.filter_response_listener: 
    class: AppBundle\EventListener\ResponseListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.response } 

步驟3,設置$paths陣列包含您的應用程序的安全路徑。如果您需要了解這些信息,請查看access_control部分下的security.yml文件。

使用Symfony Security服務,可能有更好的方法檢查頁面是否位於安全區域,但此解決方案適用於我的應用程序。

感謝這些職位,幫助我: