Spring Webflow (и Freemarker) - ограничить страницу одним пользователем

Я работаю над приложением с Spring Webflow, Freemarker, Hibernate (JPA) и Oracle.

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

Можно ли это легко сделать в Webflow или Freemarker?

Любые предложения приветствуются.

Спасибо

ОБНОВЛЕНИЕ 1

Я также использую JPA (Hibernate).

ОБНОВЛЕНИЕ 2

И приложение будет развернуто в кластерном JBoss.


person adi    schedule 15.07.2012    source источник
comment
А что, если администратор, редактирующий эту страницу, не отправит редактирование? Все остальные ждут, пока его сеанс когда-нибудь закончится? Почему бы вам вместо этого не использовать оптимистическую блокировку?   -  person JB Nizet    schedule 15.07.2012
comment
Это план на самом деле. И не могли бы вы объяснить, как сделать оптимистическую блокировку?   -  person adi    schedule 15.07.2012


Ответы (1)


Вместо этого я бы использовал оптимистическую блокировку. Следующая стратегия используется JPA.

Вы добавляете поле version в таблицу, содержащую данные для редактирования. Каждый раз, когда вы загружаете данные для редактирования, вы также загружаете поле version. Каждый раз, когда данные изменяются, вы увеличиваете это поле версии на 1. Но чтобы иметь возможность сохранять данные, у вас должна быть версия в памяти, равная версии, хранящейся в базе данных:

update data set ..., version = version + 1 where ... and version = :inMemoryVersion

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

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

person JB Nizet    schedule 15.07.2012
comment
Спасибо, оптимистическая блокировка выглядит хорошо. В своем исходном посте я забыл упомянуть, что я также использую Hibernate (сейчас обновлено). Предоставляет ли спящий режим «оптимистическую блокировку» «из коробки»? - person adi; 15.07.2012
comment
Я прочитал несколько сайтов об «оптимистической блокировке», и это должно сработать. Но как я покажу сообщение, например. «X редактирует эту страницу, поэтому ваш доступ только для чтения» во всплывающем окне для других пользователей. Мне нужно знать имя человека, который заблокировал функциональность. И мое требование касается не блокировки строки, а блокировки функциональности. - person adi; 15.07.2012
comment
Если вы используете оптимистическую блокировку, в этом нет смысла. Суть оптимистичной блокировки состоит в том, чтобы позволить всем работать так, как будто других не существует, и быть оптимистичными в отношении того, что не будет никакого конфликта. Если он есть, вы его обнаружите. Да, Hibernate поддерживает его из коробки. Если вам нужно сделать страницу доступной только для чтения, используйте pessimistic, как я объяснил, и свяжите имя шкафчика с замком. - person JB Nizet; 15.07.2012