Как лучше всего защитить вводимые пользователем данные (еще не отправленные) от тайм-аута сеанса?

Я разрабатываю и поддерживаю небольшие веб-приложения для интрасети (JSP и Resin).

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

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

Какая лучшая практика?


Дополнение Наши пользователи делают несколько видов отчетов с помощью веб-приложения, и все содержимое каждого отчета хранится в JavaBean, хранящемся в сеансе.

По мнению некоторых, быстрое исправление должно быть выполнено с помощью Ajax или iframe.

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
445
9

Ответы 9

Мне совсем недавно понадобилось искать решения этой проблемы.

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

Другим возможным решением может быть разделение форм на части, чтобы каждый раздел был достаточно маленьким, чтобы его можно было заполнить и отправить в течение тайм-аута сеанса.

Если они все еще не работают под Windows 95, я почти уверен, что их браузеры будут поддерживать AJAX.

ine 31.10.2008 03:58

@amdfan, некоторые компании заставляют отключать javascript в своей политике (что хорошо для безопасности)

Frederic Morin 31.10.2008 04:21

Вы можете время от времени хранить данные в файле cookie, использовать Gears в качестве временного хранилища (если данные сложные или требуют хранилища более 4 КБ) или отправлять временные данные на сервер каждые n секунд с помощью AJAX.

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

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

Keeg 31.10.2008 10:22

@trustyteen: время ожидания сеансов истекло по определенной причине, поэтому идеальное решение - написать приложение с нуля, чтобы изящно обрабатывать тайм-ауты сеансов (т.е. без огромных форм). В качестве быстрого решения метод AJAX-ping делает страницу менее защищенной. Увеличение тайм-аута сеанса сделает все страницы менее уязвимыми.

MusiGenesis 31.10.2008 18:43

FWIW, я бы не стал использовать здесь свое собственное предложение. Если пользователи веб-приложения постоянно теряют работу из-за тайм-аутов сеанса, приложение просто необходимо переписать.

MusiGenesis 31.10.2008 18:48

Сделайте ваши приложения не имеющими состояния на стороне сервера. Вы можете включить любое состояние, которое необходимо поддерживать, в скрытые поля ввода. Если безопасность важна, вы можете зашифровать данные, прежде чем помещать их в поле.

Пример помещает в вашу форму что-то вроде этого:

<input type = "hidden" name = "user" value = "bob" />
<input type = "hidden" name = "currentRecordId" value = "2345" />
<input type = "hidden" name = "otherStuff" value = "whocares" />

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

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

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

Lee Kowalkowski 31.10.2008 11:50

@ Jere.Jones и @Lee Kowalkowski. Не могли бы вы предоставить ссылки для изучения веб-приложений без сохранения состояния?

ulm 31.10.2008 13:22

У меня нет ссылок. Извиняюсь. Это просто идея, которую я использую. Я даже не был уверен, что это «настоящий» образец. :)

Jere.Jones 31.10.2008 18:31

@ulm: Что ж, с архитектурной точки зрения было бы полезно, если бы одной из целей веб-приложения было RESTful (en.wikipedia.org/wiki/REST). По моему опыту, мне было бы неудобно, если бы я подумал об этом в последнюю очередь для завершенного приложения. Поскольку ваши URI потребовали бы большой предусмотрительности.

Lee Kowalkowski 01.11.2008 00:24

@ Ли Ковальковски: Спасибо за информацию. Как вы отметили, кажется сложной задачей переписать приложение, не поддерживающее REST, и сделать его RESTful. @ Jere.Jones: Спасибо за ответ. Было бы интересно прочитать, если бы вы могли опубликовать свои идеи.

ulm 01.11.2008 07:00

Клиентский сценарий может изменять эти скрытые поля. Лучше имейте это в виду.

Josh Stodola 05.02.2009 18:49

Это работает только для сайта без защиты. Если пользователи входят в систему, вам потребуется сеанс. Помещать ссылочный номер сеанса в скрытое поле - плохая идея.

Nemi 16.09.2009 01:32

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

Что вам нужно сделать, так это добавить скрытый iframe где-нибудь на странице. Пусть iframe указывает на простой html-документ, обслуживаемый вашим сервером приложений, в котором есть метатег, который обновляется каждые 29 минут (для сеанса, который истекает через 30 минут). Таким образом, пока у человека открыта ваша веб-страница, его сеанс не истечет. Однако, когда они уйдут с вашего сайта, срок его действия истечет как обычно. Вы получаете неограниченную продолжительность сеанса без недостатка сеансов, которые выходят из-под контроля.

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

Дайте мне знать, если вам понадобится еще пример.

сеанс все равно будет действителен, даже если файл cookie отсутствует на клиенте. кто-то еще может захватить их сеанс.

Shawn 31.10.2008 06:51

Спасибо за предложение. Думаю, я попробую добавить скрытый iframe для форм ввода отчетов. (Просмотр отчетов не стоит заморачиваться.)

ulm 31.10.2008 13:27

Я бы рекомендовал изучить альтернативу без сохранения состояния (то, что не зависит от атрибутов сеанса) тому, что вы делаете.

Возможно, мы сможем помочь больше, если будем знать, для чего именно вы полагаетесь на сеансы.

Умм ..

Как насчет отображения подсказки пользователю о сессия скоро истечет - сохраните данные (скажем, за 5 минут до этого), чтобы он мог сохранить данные. Таким образом, они знают, что им нужно сохранить, и в случае, если срок сеанса действительно истек, это будет сделано позже, если они не ответят.

Это альтернатива в случае, если вы хотите избежать непрерывного пинга на сервер с использованием AJAX.

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

ulm 31.10.2008 13:18

Не используйте объект сеанса. Как вы сами понимаете, это причина всевозможных проблем с удобством использования.

Это мое золотое правило разработки веб-приложений: не используйте сеанс.

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

Привет, у вас есть авторитетные источники, поддерживающие ваше «золотое правило»? Я считаю, что это интересная тема, в которой можно подробнее остановиться.

JacobE 31.10.2008 12:28

Я бы вызвал «после проверки Ajax истечения срока действия сеанса» всплывающую форму в модальном окне, в которой пользователь должен снова войти в систему. Это всплывающее окно будет поверх текущей страницы / формы. Так что данные не будут потеряны.

P.N Обновите токен сеанса, если он у U есть ... в скрытом поле.

Другие вопросы по теме