在Symfony2中延长会话生存期

时间:2013-07-29 09:06:05

标签: ajax session symfony

我想在Symfony2 sesion被销毁之前扩展sesion_liftime。

我向用户显示他将在几秒钟后退出,并且当他/她确认扩展该sesion时,我向控制器发送ajax请求,该控制器应该扩展该sesion。但问题是请求无效。

我尝试了几种不同的解决方案,但没有一种解决方案。

<script type="text/javascript">
             var timeoutID;

            function delayedAlert() {
              timeoutID = window.setTimeout(slowAlert, 15000);
            }

            function slowAlert() {
                setTimeout(logout, 5500)
              var r=confirm("You will be logout in 5 seconds!");
              if (r==true)
              {
                $.ajax({
                    url: 'http://localhost/interactivo/web/app_dev.php/check',
                    xhrFields: {
                        withCredentials: true
                     }
                });
                alert("You wont be logout");
              }
            }

            function logout() {alert("You are logout");};

            delayedAlert();
        </script>


/**
* @Route("/check")
*/
public function indexAction()
{
//        FIRST ATTEMPT
//        $value = 'something from somewhere';
//

//        setcookie("TestCookie", $value);
//        setcookie("TestCookie", $value, time()+3600);  /* expire in 1 hour */
//        setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1);

//        SECOND ATTEMPT
//        header('Content-type: text/html; charset=utf-8');
//        echo 'TEST';

//        THIRD ATTEMPT
        $session = $this->container->get('session');

        $lastUsed = new \DateTime();
        $lastUsed->setTimestamp($session->getMetadataBag()->getLastUsed());

        return $this->render('GLHomeBundle:Default:sesion.html.twig', array( 'entities'=> $lastUsed));
    }

我做错了什么?

2 个答案:

答案 0 :(得分:0)

我认为这不是一个好的解决方案(如果有效),但symfony中会话的cookie称为“PHPSESSID”。尝试将此cookie的生命周期设置为所需的时间?我使用这种方法将我的会话通过Drupal和Varnish传递给客户端,所以我认为它可以延长会话的生命周期。

此致 Peekmo

答案 1 :(得分:0)

我终于找到了解决方案。我使用了来自site的Session KeepAlive Listener。 我通过AJAX这样调用控制器:

function slowAlert() {
            setTimeout(logout, 40000)
          var r=confirm("You will be logout in 20s!");
          if (r==true)
          {
            $.ajax({
                url: "{{ url('_demo_hello') }}",
                xhrFields: {
                    withCredentials: true
                 }
            });
            alert("You wont be logout");
          }
        }

控制器非常简单:D

/**
 * @Route("/check", name="_demo_hello")
 */
public function checkAction()
{      
    $response = new Response();

    return $response;
}