【问题标题】:How can I refresh the session during a POST request?如何在 POST 请求期间刷新会话?
【发布时间】:2012-01-26 12:42:48
【问题描述】:

我正在 Symfony2 中构建一个用户登录的 Ajax 应用程序,然后从那时起,一切都由 POST 请求处理。在config.yml 中将会话生命周期定义为 5 分钟后,我遇到了用户会话在 5 分钟后失效的问题,即使他们正在发出 POST 请求。每次发出请求时,我都想在会话无效之前重置倒计时,但我不确定如何有效地做到这一点。

我目前正在考虑的方法是为kernel.request事件编写一个监听器,检查请求方法是否为POST,并操作会话类。我还没有这样做,但这似乎不是一个干净的解决方案,因为每次发出请求时侦听器都需要触发。

这是我的会话配置:

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

有什么想法吗?解决方案是纯 PHP 而不是 Symfony?

【问题讨论】:

  • ajax 请求是否与最初设置会话 cookie 的域名和 symfony 应用程序相同?
  • 请将您的 yml 会话配置添加到问题中。

标签: php session symfony


【解决方案1】:

会话的生命周期是它的最大年龄。这是通过已经创建的 cookie 控制的,并且不再从服务器端刷新(因为会话已经建立)。您可以手动更新此 cookie,我认为这将通过 symfony2 实现。

可能最简单的方法是在不破坏会话的情况下重新生成会话 ID:

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

这应该会触发会话 cookie 的更新。

可能相关的问题:

【讨论】:

  • 这很好用。毕竟我最终在kernerl.request 上使用了一个监听器。
【解决方案2】:

为了说明这里已经准备好的东西,这里是一个注册为内核请求侦听器的完整工作示例。对于此示例,我将超时时间硬编码为 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2016-10-05
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多