更好的策略:使用JS SetTimeout定期检查会话,或者在ajax请求中检查会话

时间:2018-11-09 11:28:35

标签: javascript php jquery codeigniter

如果用户的会话已过期,然后他们回来并单击导致发出ajax请求的按钮,则我当前的重定向到登录方法无效。为了解决此问题,我实现了在发出请求时检查会话的功能,如果会话过期,该请求将返回401状态标头。然后在我的JavaScript中,我重定向到登录页面。这种方法的缺点是我必须返回并在整个应用程序中重新实现。

我读过其他地方,人们建议使用计时器定期使用javascript检查会话。我喜欢它无需用户交互即可自动检查并重定向回登录的想法,但是我想知道它是否只是向服务器创建大量请求,而第一种方法仅在需要时才发出请求。

我还可以想象您同时实现这两种情况的情况。超时时间会更长一些,因此,如果用户在计时器之前捕获到超时,则会返回401状态标头。

我很想听听其他人如何实现此功能,以及最佳策略到底是什么?我是否过多强调服务器的其他呼叫?

这是我当前的实现方式:

在我的基本控制器中:

public function is_session_valid()
    {
        $userData = $this->session->userdata('user_data');

        if(!empty($userData)) //session still in place, return true
        {
            return true;
        }
        else  //session has expired.
        {
            $rememberMe = $this->input->cookie('remember_me');

            if(!empty($rememberMe) && $this->Auth_model->verify_auth_token($this->input->cookie('remember_me')))
            {
                //use the cookie to verify the user and log them in.
                $selector = explode(':', $this->input->cookie('remember_me'))[0];
                $this->Auth_model->login_with_cookie($selector);
                $this->session->set_userdata('user_data', $this->Auth_model->get());
                $this->regenerate_session();

                return true;
            }

            return false;
        }
    }

然后每个控制器方法都按如下方式调用此函数:

if($this->input->is_ajax_request() && !$this->is_session_valid())
{
    $this->output->set_status_header(401);
    exit;
}

现在,我处理常规的页面请求和ajax请求的方式有所不同,因为我先实现了页面请求,然后在会话超时时发现,如果用户单击导致ajax请求的按钮,则没有得到处理正确地。我想我可以将功能组合在一起,然后一次完成所有操作。

1 个答案:

答案 0 :(得分:2)

实际上,我正在用心跳检查会话的到期时间,但是我发现您的方法检查每个动作的到期时间都还不错(以节省用户的带宽)。我对实现您的方法有一个更好的主意,因为您当然不能通过整个应用程序中的每个方法来添加检查;但是如果您的控制器扩展了MY_Controller甚至扩展了Admin_controller的{​​{1}},Public_Controller,那么在该控制器中,您可以将检查绑定到该控制器的构造函数或render方法,解决问题。