Сообщение о тайм-ауте сеанса в RoR с использованием Devise - PullRequest
5 голосов
/ 27 января 2012

У меня есть приложение, защищенное с помощью devise, и время ожидания сеанса 30 минут.С devise все работает нормально для нормальной навигации, если пользователь нажимает на ссылку по истечении времени ожидания, он перенаправляется обратно на экран входа в систему с сообщением «Ваш сеанс истек, пожалуйста, войдите снова, чтобы продолжить.», Отлично.

Однако у меня есть AJAX во многих местах.Если время сеанса истекло, и пользователь выполняет операцию AJAX, мне нужно то же поведение, что и выше, а не молчаливое завершение работы с ошибкой 401 в фоновом режиме.

Пока у меня есть этот код jquery на каждой странице, чтобы перехватить 401и перезагрузите:

$(document).ajaxError(function(e, error) {
  switch(error.status) {

    case 401: {
      // unauthorised (possible timeout)
      location.reload();
      break;
    }

Это работает достаточно хорошо, но есть досадная проблема:

Поскольку запрос ajax сначала разрабатывается, когда мое приложение перезагружает страницу, я получаю направленную на вход в системуна странице, но я не вижу сообщения об истечении времени ожидания, я вижу не прошедшее проверку подлинности «Вам необходимо войти или зарегистрироваться перед тем, как продолжить».сообщение.

Есть ли способ убедиться, что во втором запросе устройство все еще показывает сообщение о превышении времени ожидания?

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Я думаю, что вам нужно вручную показать это сообщение, например, путем перенаправления на определенный URL или установки какого-либо параметра запроса.

проблема в том, что после вашего запроса 401 вы получили новый сеанс и при перезагрузке браузера следующий запрос попадет в ваше приложение с пустым сеансом. вот почему вы получаете неаутентифицированное сообщение.

1 голос
/ 29 октября 2013

Сообщение о тайм-ауте «Ваш сеанс истек. Пожалуйста, войдите снова, чтобы продолжить», доступно в xhr.responseText, поэтому один из подходов заключается в том, чтобы просто отобразить это:

$(document).ajaxError(function(e, error) {
  switch(error.status) {

    case 401: {
      // unauthorised (possible timeout)
      location.reload();
      alert(xhr.responseText);
      break;
    }

Мне кажется, что это выглядит лучше: нажмите Обновить в форме Ajax, получите уведомление о том, что время сеанса истекло, затем посмотрите «Вам необходимо войти или зарегистрироваться перед продолжением» в мигать на странице входа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...