Symfony2 - 注销并清除缓存+阻止后退按钮

时间:2015-03-11 15:38:15

标签: php symfony caching listener handler

我尝试在用户注销时终止浏览器缓存。 我实现了LogoutSuccessHandlerInterface来扩展onLogoutSuccess方法。 没有错误,但是当我退出时,我可以在浏览器中按回按钮,我看到我的profil页面=>如果我刷新此页面,我会自动重定向,因此我正确登出。

security.yml

logout:
    path:   /logout
    target: /
    invalidate_session: true
    success_handler: project_user.handler.logout_handler

services.yml

project_user.handler.logout_handler:
    class:  Project\UserBundle\Handler\LogoutHandler

项目/ UserBundle /处理器/ LogoutHandler.php

<?php
namespace Project\UserBundle\Handler;

use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;

class LogoutHandler implements LogoutSuccessHandlerInterface
{
  public function onLogoutSuccess( Request $request )
  {
    $response =  new RedirectResponse( '/' );

    $response->headers->addCacheControlDirective( 'no-cache', true );
    $response->headers->addCacheControlDirective( 'max-age', 0 );
    $response->headers->addCacheControlDirective( 'must-revalidate', true );
    $response->headers->addCacheControlDirective( 'no-store', true );

    return $response;
  }
}

我尝试使用this solution并且效果很好,但是为每个请求调用此方法(每个页面多次)并导致速度减慢。 请帮忙!

THX

2 个答案:

答案 0 :(得分:0)

试试这个,对我有用。

<?php 

namespace YourBundle;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class KernelSubscriber implements EventSubscriberInterface {

    public static function getSubscribedEvents() {
        return array(
            KernelEvents::RESPONSE => array(
                array('clearBrowserCache', 434255),
            ),
        );
    }

    public function clearBrowserCache(FilterResponseEvent $event) {
        $response = $event->getResponse();

        $response->headers->addCacheControlDirective('no-cache', true);
        $response->headers->addCacheControlDirective('max-age', 0);
        $response->headers->addCacheControlDirective('must-revalidate', true);
        $response->headers->addCacheControlDirective('no-store', true);        
    }

}

services.yml

kernel_subscriber:
    class: YourBundle\KernelSubscriber
    tags:
        - { name: kernel.event_subscriber }

答案 1 :(得分:-1)

我已经成功使用的方法只是在注销后重定向到上一页。如果上一页受到保护,您的身份验证系统将重定向回登录页面。现在当你按下后退按钮时,你应该再次点击登录页面。

在这里查看我在Laravel中的示例: https://laracasts.com/discuss/channels/requests/back-button-browser