Session 如何在发送响应后防止额外的页面请求

Session 如何在发送响应后防止额外的页面请求,session,symfony,redirect,request,listener,Session,Symfony,Redirect,Request,Listener,我在kernel.request上配置了一个监听器,当会话时间达到某个值时,它会设置一个带有重定向的新响应。侦听器工作正常,在会话结束后,在下一个请求中重定向到某个页面。但我的问题是在页面上,我有很多链接,如果我多次按同一链接,重定向的初始请求将被取消/停止,并在最后一个链接被按下时发出新请求,因此即使会话已结束并被破坏,它也会通过我的重定向。因此,我的问题是,如何防止在发出第一个请求后出现额外的请求/链接按压? 这是我的密码: public function onKernelReque

我在kernel.request上配置了一个监听器,当会话时间达到某个值时,它会设置一个带有重定向的新响应。侦听器工作正常,在会话结束后,在下一个请求中重定向到某个页面。但我的问题是在页面上,我有很多链接,如果我多次按同一链接,重定向的初始请求将被取消/停止,并在最后一个链接被按下时发出新请求,因此即使会话已结束并被破坏,它也会通过我的重定向。因此,我的问题是,如何防止在发出第一个请求后出现额外的请求/链接按压? 这是我的密码:

    public function onKernelRequestSession(GetResponseEvent $event)
{
    $request = $event->getRequest();
    $route = $request->get('_route');
    $session = $request->getSession();
    if ((false === strpos($route, '_wdt')) && ($route != null)) {
        $session->start();
        $time = time() - $session->getMetadataBag()->getCreated();
        if ($route != 'main_route_for_idle_page') {
            if (!$session->get("active") && $route == 'main_route_for_site_pages') {
                $session->invalidate();
                $session->set("active", "1");
            } else {
                if ($time >= $this->sessionTime) {
                    $session->clear();
                    $session->invalidate();
                    $event->setResponse(new RedirectResponse($this->router->generate('main_route_for_idle_page')));
                }
            }
        } else {
            if ($session->get("activ")) {
                $session->clear();
                $session->invalidate();
            }
        }
    }
}
谢谢。

Idea#1:简单增量计数器
  • 每个请求都以param的形式发送序列号,该序列号在服务器上按预期进行验证
  • 服务器增加数字并通过响应将其发送回
  • 新号码将在以后的请求中使用
基本上,如果服务器期望序列号为
2
,而客户端发送
1
,则请求将被拒绝

想法2:每次都是唯一的散列
与上面的想法类似,但使用独特的哈希来消除增量序列的预测性。

我使用JQuery解决了这个问题:当按下一个链接时,我禁用了其他链接,因此只从页面发出一个请求:

var isClicked = false;
$(".menu-link").click(function(e) {
  if(!isClicked) {
      isClicked = true;
  } else {
      e.preventDefault();
  }
});

谢谢。

谢谢你的想法,但我用Jquery解决了这个问题。