2012-05-02 2 views
1

Мы создали веб-приложение Spring MVC, которое в значительной степени полагается на пользователя, чтобы делать что-то в определенном порядке, и хотя оно не позволяет пользователям обойти это (не пытаясь очень сильно) в обычном случае (не предлагая варианты " перейдите к местам, «которых вы не должны в данный момент), у нас возникают некоторые проблемы, когда люди открывают другой экземпляр приложения в новой вкладке или окне браузера.Как эффективно предотвратить одновременное использование веб-приложения за один сеанс?

Поскольку приложение хранит модель домена в сеансе пользователя, использование программы в другом окне может испортить данные модели, мы уже внедрили механизм идентификации страницы, который проверяет пользователя с помощью программы в правильном а не с помощью навигации браузера, но мы по-прежнему сталкиваемся с проблемами, когда в одном окне происходят такие вещи, как сброс программы (это функция, перенаправление пользователя на главный экран и очистка модели домена), и затем пользователь пытается сделать что-то, полагаясь на модель домена, которая будет заполнена действительными данными в другом окне (что приведет к ошибке NullPointerException довольно быстро).

+0

Вы не должны полагаться на пользователя. Сначала проверяет права пользователя на стороне сервера, прежде чем переходить к любым активным операциям. И не забудьте поймать исключения и проверить необходимые объекты на ** null **. Это сделает ваше приложение более надежным. – kapand

ответ

0

В случае, если кто-либо читает этот вопрос еще раз:

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

0

Сохранение некоторые данные пользователя (например, идентификатор, имя, адрес электронной почты) в сеансе может быть нормально, но храня пользователя состояние (или какие-либо данные, которые часто меняется и/или существенно влияет на другие вещи в вашем приложении) Безразлично» t звучит как хорошая идея.

Надеюсь, один из следующих подходов будет соответствовать вам:

  • Не сохранять состояние в сеансе - загрузить его из базы данных каждый раз, когда вам это нужно (в вашем случае, когда пользователь пытается получить доступ к одному шагов, которые должны быть выполнены в порядке). Если вы используете кеширование, это не должно иметь серьезных последствий для производительности.
  • Не сохранять состояние в базе данных, только в сеансе - работает для ограниченных случаев (например, заказывает авиабилеты), где вы можете отложить фиксацию объекта домена до завершения процесса.
  • Используйте Ajax для многоступенчатых процессов и не сохраняйте состояние вообще (за исключением неявно в браузере). Это требует ввода всех шагов на одну страницу и ajaxification некоторых из вашего кода.

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

+0

Я забыл упомянуть в своем OP: сеанс - единственное, что мы можем использовать для идентификации пользователя, поскольку нам не нужен уникальный логин. Существует аутентификация, но многие пользователи (как и у фактических лиц) будут использовать один пользователь (как в технической учетной записи) по дизайну. Как я вижу, сохранение состояния в другом месте просто переместило бы основную проблему в другое место или я не ошибаюсь здесь? Ваша третья точка звучит интересно! Мне нужно взглянуть на то, насколько это возможно в нашей нынешней архитектуре. – kjosh

0

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

Смежные вопросы