2011-12-23 6 views
6

私はSymfony2でユーザーがログインしてから、その時点からすべてがPOST要求によって処理されるAjaxアプリケーションを構築しています。 config.ymlでセッションの有効期間を5分に設定した後、POST要求を出しているのに5分後にユーザーのセッションが無効になる問題が発生します。要求が行われるたびに、セッションが無効になる前にカウントダウンをリセットしたいのですが、これを効率的に行う方法がわかりません。POSTリクエスト中にセッションを更新するにはどうすればよいですか?

私が現在考えている方法は、kernel.requestイベントのリスナーを作成し、リクエストメソッドがPOSTかどうかを確認し、セッションクラスを操作しています。私はまだこれをしていないが、清潔な解決策のようには見えない。なぜなら、リスナーはリクエストが行われるたびに発砲する必要があるからだ。

session: 
    default_locale: %locale% 
    auto_start:  true 
    lifetime:  300 

任意のアイデア:

は、ここに私のセッションの設定ですか? symfonyではなく、PHPで解決できるのでしょうか?

+0

は同じに作られているのAjaxリクエストです元々セッションクッキーを設定していたドメイン名とsymfonyアプリケーションですか? – RobNY

+0

うん、同じドメイン、同じアプリ。 –

+0

質問にymlセッション設定を追加してください。 – hakre

答えて

9

セッションの有効期限はです。最大期限です。これはすでに作成されており、セッションが既に確立されているため、サーバー側からもう更新されていないCookieによって制御されます。このクッキーを手動で更新するだけで、symfony2でこれを実現できると思います。

おそらく最も簡単には/セッションを破壊O wのセッションIDを再生成することです:

$this->get('session')->migrate(); 

これはセッションクッキーの更新をトリガする必要があります。

おそらく関連の質問:

+0

これは素晴らしい動作します。私は結局、 'kernerl.request'のリスナーを使用して終了しました。 –

1

ここでは、ここにすべての準備ができているものに言えば、カーネルの要求リスナとして登録完全な実施例です。この例では、タイムアウトを1,200秒(20分)にハードコードしています。あなたは(私は生産に何をしたかである)あなたのparameters.ymlファイルからの時間に渡すことができます。

#src\My\AppBundle\Resources\config\services.yml 
kernel_request.listener: 
    class: My\AppBundle\EventListener\KernelRequestListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
    arguments: [@security.context, 1200] 

とクラス:

#Place in your src\My\AppBundle\EventListener folder 
namespace My\AppBundle\EventListener { 

    use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
    use Symfony\Component\HttpKernel\HttpKernel; 
    use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken; 
    use Symfony\Component\Security\Core\Exception\CredentialsExpiredException; 
    use Symfony\Component\Security\Core\SecurityContextInterface; 

    class KernelRequestListener { 

    /** @var int */ 
    private $maxIdleTime; 

    /** @var SecurityContextInterface */ 
    private $securityContext; 

    function __construct(SecurityContextInterface $securityContext, $maxIdleTime) { 
     $this->securityContext = $securityContext; 
     $this->maxIdleTime = $maxIdleTime; 
    } 

    public function onKernelRequest(GetResponseEvent $event) { 
     if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) { 
      // don't do anything if it's not the master request 
      return; 
     } 

     $session = $event->getRequest()->getSession(); 
     $token = $this->securityContext->getToken(); 

     if ($session !== null && !($token instanceof AnonymousToken) && $token->isAuthenticated()) { 
      $session->start(); 

      if ((time() - $session->getMetadataBag()->getLastUsed()) > $this->maxIdleTime) { 
       throw new CredentialsExpiredException(); 
      } 

      $session->migrate(false, $this->maxIdleTime); 
     } 
    } 
} 
関連する問題