如何在响应发送后阻止其他页面请求

时间:2014-05-29 11:57:53

标签: session symfony redirect request listener

我在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();
            }
        }
    }
}

Thak you。

2 个答案:

答案 0 :(得分:0)

想法#1:简单的增量计数器

  • 每个请求都将序列号作为param发送,并在服务器上按预期进行验证。
  • 服务器递增数字并通过响应
  • 将其发回
  • 新号码将在未来的请求中使用

基本上,如果服务器期望SEQUENCE号码为2而客户端发送1,则该请求将被拒绝。

想法#2:每次都有唯一的哈希

与上述想法类似,但使用独特的哈希来消除增量序列的预测性质。

答案 1 :(得分:0)

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

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

感谢。