Чаши Грааля: обработка события перерыва HTTP-сессии

Я пишу применение Чаш Грааля, которое использует безопасность Спринта для идентификации. Я должен показать сообщение пользователю, который автоматически вышелся из-за бездеятельности.

Мое заявление использует и запросы AJAX и прямые запросы диспетчерам. Я заметил, который для безопасности Спринта запросов AJAX возвращает ответ HTTP с кодом 401, и я пересмотрел отображение URL по умолчанию таким способом:

class UrlMappings {
    static mappings = {
        //...

         "401" (controller: 'errors', action: 'inactivityLogout')
    }
}

И вот тело inacticityLogout() метод:

def inactivityLogout() {
    log.debug("the user is logged out due to inactivity")
    session.setAttribute('inactivityMessage', "You have been logged out due to inactivity.")
    render(status: 401)
}

Тогда LoginController проверяет, установлен ли inactivityMessage признак и показывает соответствующее сообщение на Странице входа в систему.

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

Поджигатель показывает, что применение возвращает код 302, Перемещенный Временно, таким образом, я, хотя это это - причина. Но тогда я заметил, что тот же самый код возвращен для требований AJAX также. Так, теперь у меня нет идей, что является различием между AJAX и запросами non-AJAX и почему последние не обработаны двигателем отображения URL Чаш Грааля.

Какие-либо идеи, что могло быть неправильным с моим текущим решением? Эта проблема может быть решена совершенно другим способом?

Спасибо!

1
nl ja de
Вы желаете показать сообщение на основе их щелкающий по чему-то или автоматически когда сессия истекает без какого-либо взаимодействия с пользователем вообще?
добавлено автор Gregg, источник
Да, идея состоит в том, чтобы показать сообщение без любого взаимодействия с пользователем. Просто хочу сообщить пользователю, почему он вышелся система.
добавлено автор Roman Reva, источник

2 ответы

Используя jQuery, это - то, что я делаю:

$.ajaxSetup({
   statusCode: {
     401: function() {
       $('#ajaxAuthModal').modal('show');
     }
   }
});

У меня есть это в глобальном файле JS так, чтобы все мои запросы ajax обращались с 401. Тогда я просто показываю модальное, которое говорит пользователю, что им нужно к логину снова. Единственная реальная разница необходимо было бы достигнуть того, что вы хотите, должна получить голоса безопасного ресурса через ajax. Это позволило бы этой 401 функции вызывать, когда эти 401 возвращены.

У большинства библиотек JavaScript как jQuery должна быть подобная особенность, чтобы $ .ajaxSetup() .

2
добавлено
Спасибо, это - отличное решение для запросов AJAX! Но я также должен перенаправить пользователя к LoginController, когда он пытается провести другому и сообщению показа там. Весенняя безопасность перенаправляет пользователя к LoginController автоматически, когда сессия истекает, но тогда я должен понять, достигли ли пользователи просто этой страницы прямой связью с веб-сайтом, или он вышелся из-за бездеятельности. Могу быть я didn' t указывают это достаточно ясный, но сообщение нужно показать не как всплывающее окно, но как простой текст на странице входа в систему.
добавлено автор Roman Reva, источник

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

Таким образом, по существу, как только пользователь загрузил страницу нет никакого контакта с сервером. Сервер не может "выдвинуть" сообщение к браузеру. Таким образом, то, что необходимо будет сделать, проверить, есть ли активная встреча с JavaScript. Можно сделать это с таймером довольно легко.

В вашем main.gsp устанавливает переменную JavaScript $ {session.maxInactiveInterval} . Это даст вам максимальную продолжительность пользовательской сессии. Просто начните setTimeout (функция() {/* код, чтобы показать пользователю здесь */}, maxInterval) .

Не забудьте перезагружать интервал на требованиях AJAX, потому что, так как страница не перезагружается, это не будет перезагружено.

Как примечание стороны, отображения URL должны только играть роль по запросам non-AJAX, потому что страница не перезагружается, таким образом ничто, чтобы показать страницу к. Необходимо будет использовать что-то как @Gregg, использует, чтобы обработать запросы AJAX.

1
добавлено
Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff