Как узнать, доступен ли общий JSP-файл нескольким пользователям? - PullRequest
1 голос
/ 01 февраля 2012

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

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

Ответы [ 5 ]

2 голосов
/ 01 февраля 2012

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

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

0 голосов
/ 01 февраля 2012

Вы можете хранить некоторую информацию (например, в общей карте и т. Д.), Что контент уже просматривается.

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

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

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

0 голосов
/ 01 февраля 2012

Сохраните флаг в ServletContext, говоря, что страница находится в процессе редактирования.

1) когда пользователь получает доступ к общей странице, установите флаг, используя servletContext.setAttribute("linkEdited", "true"). Кроме того, установите его внутри пользовательской сессии usign session.setAttribute("linkEdited", "true").

2) сбросить значения, когда пользователь фиксирует введенные данные servletContext.setAttribute("linkEdited", null) и session.setAttribute("linkEdited", null).

3) также unset (выполните шаг 2) , когда сеанс получает тайм-аут и session.getAttribute("linkEdited") возвращает true. По истечении времени ожидания сеанса будет вызван HttpSessionListener.sessionDestroyed().

4) Когда любой пользователь получает доступ к общей странице, отметьте session.getAttribute("linkEdited") и servletContext.getAttribute("linkEdited"). Если для атрибута установлено значение true, введите сообщение о том, что страница редактируется.

0 голосов
/ 01 февраля 2012

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

0 голосов
/ 01 февраля 2012
  • Добавить фильтр
  • Иметь синхронизированную карту области приложения
  • Когда приходит запрос, установите флаг some, когда пользователь завершит редактирование, вы можете сбросить этот флаг, и еслизначит, в то время как другой пользователь приходит на основании флага, вы можете перенаправить его на другую страницу

Обновление:

, если первый пользователь открывает URL,тогда я обновлю синхронизированную карту с некоторыми деталями.Если придет второй пользователь, я перенаправлю его на другую страницу.Теперь, если первый пользователь не фиксирует изменения, второй пользователь будет заблокирован навсегда.Есть ли способ избежать этого?

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

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