如果用户的会话已过期,然后他们回来并单击导致发出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请求的按钮,则没有得到处理正确地。我想我可以将功能组合在一起,然后一次完成所有操作。
答案 0 :(得分:2)
实际上,我正在用心跳检查会话的到期时间,但是我发现您的方法检查每个动作的到期时间都还不错(以节省用户的带宽)。我对实现您的方法有一个更好的主意,因为您当然不能通过整个应用程序中的每个方法来添加检查;但是如果您的控制器扩展了MY_Controller
甚至扩展了Admin_controller
的{{1}},Public_Controller
,那么在该控制器中,您可以将检查绑定到该控制器的构造函数或render方法,解决问题。