Если сеанс пользователя истек, а затем он возвращается и нажимает кнопку, которая вызывает 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, он не обрабатывается. правильно. Я думаю, что я мог бы объединить функциональность и сделать все это за одну проверку.