Я разрабатываю и поддерживаю небольшие веб-приложения для интрасети (JSP и Resin).
Некоторым пользователям требуется так много времени на заполнение форм, что, при отправке они теряют все свои входные данные из-за тайм-аута сеанса.
В настоящее время я увеличил тайм-аут сеанса до 30 минут и отображать часы обратного отсчета до тайм-аута сеанса вверху страницы, но, Я думаю, что это должны быть лучшие способы защитить вводимые пользователем данные.
Какая лучшая практика?
Дополнение Наши пользователи делают несколько видов отчетов с помощью веб-приложения, и все содержимое каждого отчета хранится в JavaBean, хранящемся в сеансе.
По мнению некоторых, быстрое исправление должно быть выполнено с помощью Ajax или iframe.
Теперь я знаю, что сеансом с тяжелыми предметами лучше не злоупотреблять, но я не уверен, как лучше всего реорганизовать текущий беспорядок. Некоторые предлагали сделать веб-приложение без гражданства. Любые предложения по рефакторингу приветствуются.




Мне совсем недавно понадобилось искать решения этой проблемы.
Направление, которое выглядело наиболее многообещающим, заключалось в использовании AJAX для периодической проверки того, были ли введены данные, и отправки их на сервер. Если браузеры, работающие в вашей компании, поддерживают AJAX, это одна из возможностей.
Другим возможным решением может быть разделение форм на части, чтобы каждый раздел был достаточно маленьким, чтобы его можно было заполнить и отправить в течение тайм-аута сеанса.
@amdfan, некоторые компании заставляют отключать javascript в своей политике (что хорошо для безопасности)
Вы можете время от времени хранить данные в файле cookie, использовать Gears в качестве временного хранилища (если данные сложные или требуют хранилища более 4 КБ) или отправлять временные данные на сервер каждые n секунд с помощью AJAX.
Это может быть, а может и не быть в вашем фреймворке, но я думаю, что если ваша страница просто использует AJAX для вызова сервера каждые пять минут (или что-то еще), то это сохранит сеанс вашего пользователя. Таким образом вам даже не нужно делать частичное сохранение вашей формы.
Почему это ужасно? Он будет держать всех пользователей, у которых все еще открыто окно браузера (то есть с большой вероятностью вернутся и захотят продолжить), подключенными, при этом довольно быстро отбрасывая все действительно неиспользуемые сеансы.
@trustyteen: время ожидания сеансов истекло по определенной причине, поэтому идеальное решение - написать приложение с нуля, чтобы изящно обрабатывать тайм-ауты сеансов (т.е. без огромных форм). В качестве быстрого решения метод AJAX-ping делает страницу менее защищенной. Увеличение тайм-аута сеанса сделает все страницы менее уязвимыми.
FWIW, я бы не стал использовать здесь свое собственное предложение. Если пользователи веб-приложения постоянно теряют работу из-за тайм-аутов сеанса, приложение просто необходимо переписать.
Сделайте ваши приложения не имеющими состояния на стороне сервера. Вы можете включить любое состояние, которое необходимо поддерживать, в скрытые поля ввода. Если безопасность важна, вы можете зашифровать данные, прежде чем помещать их в поле.
Пример помещает в вашу форму что-то вроде этого:
<input type = "hidden" name = "user" value = "bob" />
<input type = "hidden" name = "currentRecordId" value = "2345" />
<input type = "hidden" name = "otherStuff" value = "whocares" />
Основное преимущество этого заключается в том, что ваше веб-приложение может делать все, что ему нужно, только с этой страницей. Ему не нужны никакие переменные сеанса, потому что все, что ему нужно, находится на только что полученной странице. Теперь не имеет значения, сколько времени они займут, потому что нет сеанса, срок действия которого истекает.
Второстепенным преимуществом является то, что он снижает нагрузку на ваш сервер, поскольку он не опрашивает ваших пользователей периодически.
Существует бесчисленное множество преимуществ, нет необходимости в репликации сеанса между серверами, поэтому балансировка нагрузки становится простой задачей (клиент не должен быть привязан к какому-либо экземпляру сервера). Веб-приложения большого объема не должны иметь состояния. Рефакторинг не так прост, если ваше приложение уже пронизано зависимостью от сеанса.
@ Jere.Jones и @Lee Kowalkowski. Не могли бы вы предоставить ссылки для изучения веб-приложений без сохранения состояния?
У меня нет ссылок. Извиняюсь. Это просто идея, которую я использую. Я даже не был уверен, что это «настоящий» образец. :)
@ulm: Что ж, с архитектурной точки зрения было бы полезно, если бы одной из целей веб-приложения было RESTful (en.wikipedia.org/wiki/REST). По моему опыту, мне было бы неудобно, если бы я подумал об этом в последнюю очередь для завершенного приложения. Поскольку ваши URI потребовали бы большой предусмотрительности.
@ Ли Ковальковски: Спасибо за информацию. Как вы отметили, кажется сложной задачей переписать приложение, не поддерживающее REST, и сделать его RESTful. @ Jere.Jones: Спасибо за ответ. Было бы интересно прочитать, если бы вы могли опубликовать свои идеи.
Клиентский сценарий может изменять эти скрытые поля. Лучше имейте это в виду.
Это работает только для сайта без защиты. Если пользователи входят в систему, вам потребуется сеанс. Помещать ссылочный номер сеанса в скрытое поле - плохая идея.
Если вы создаете приложение для ограниченного числа пользователей (например, интрасеть компании) и не хотите, чтобы люди продолжали входить в систему весь день или чтобы они теряли свою входную информацию при длительном сидении, вы может держать сеансы открытыми неограниченное время только для людей, чей браузер открыт для вашего веб-сайта, без установки тайм-аута сеанса, чтобы он не истекал. Как только они закроют веб-сайт, сеанс истечет как обычно.
Что вам нужно сделать, так это добавить скрытый iframe где-нибудь на странице. Пусть iframe указывает на простой html-документ, обслуживаемый вашим сервером приложений, в котором есть метатег, который обновляется каждые 29 минут (для сеанса, который истекает через 30 минут). Таким образом, пока у человека открыта ваша веб-страница, его сеанс не истечет. Однако, когда они уйдут с вашего сайта, срок его действия истечет как обычно. Вы получаете неограниченную продолжительность сеанса без недостатка сеансов, которые выходят из-под контроля.
Я успешно развернул это решение в корпоративной среде на предыдущем месте работы. Веб-приложение заменило старое приложение с зеленым экраном, и, например, для них было неприемлемо пойти на обед и истечь срок действия приложения.
Дайте мне знать, если вам понадобится еще пример.
сеанс все равно будет действителен, даже если файл cookie отсутствует на клиенте. кто-то еще может захватить их сеанс.
Спасибо за предложение. Думаю, я попробую добавить скрытый iframe для форм ввода отчетов. (Просмотр отчетов не стоит заморачиваться.)
Я бы рекомендовал изучить альтернативу без сохранения состояния (то, что не зависит от атрибутов сеанса) тому, что вы делаете.
Возможно, мы сможем помочь больше, если будем знать, для чего именно вы полагаетесь на сеансы.
Умм ..
Как насчет отображения подсказки пользователю о сессия скоро истечет - сохраните данные (скажем, за 5 минут до этого), чтобы он мог сохранить данные. Таким образом, они знают, что им нужно сохранить, и в случае, если срок сеанса действительно истек, это будет сделано позже, если они не ответят.
Это альтернатива в случае, если вы хотите избежать непрерывного пинга на сервер с использованием AJAX.
Спасибо за предложение. Я уже реализовал окно предупреждения о тайм-ауте, но наши пользователи часто прерываются во время создания отчета, поэтому всплывающее предупреждение, когда пользователи отсутствуют, не очень полезно.
Не используйте объект сеанса. Как вы сами понимаете, это причина всевозможных проблем с удобством использования.
Это мое золотое правило разработки веб-приложений: не используйте сеанс.
Сказав это, используйте его экономно для вещей, которые просто невозможно сделать иначе.
Привет, у вас есть авторитетные источники, поддерживающие ваше «золотое правило»? Я считаю, что это интересная тема, в которой можно подробнее остановиться.
Я бы вызвал «после проверки Ajax истечения срока действия сеанса» всплывающую форму в модальном окне, в которой пользователь должен снова войти в систему. Это всплывающее окно будет поверх текущей страницы / формы. Так что данные не будут потеряны.
P.N Обновите токен сеанса, если он у U есть ... в скрытом поле.
Если они все еще не работают под Windows 95, я почти уверен, что их браузеры будут поддерживать AJAX.