2013-07-04 5 views
2

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

Я попытался использовать session.invalidate() на моей странице резюме, сначала в конструкторе, а затем в onAfterRender(), но оба раза я увидел страницу «Страница истек», а не вывод моей итоговой страницы.

Есть ли способ показать мою итоговую страницу, а затем аннулировать мою сессию? Или это не должно быть сделано в Wicket?

+0

session.invalidate() не тормозит отображение текущей страницы, это, вероятно, другая проблема, такая как ссылка на страницу недействительна, ленивые загруженные данные (например, спящий режим) или NPE или что-то еще. Можете ли вы предоставить фрагмент кода? –

+0

Конструктор ничего не делает, кроме добавления некоторых ярлыков на страницу. Данные поступают как Java-компонент, поэтому нет никакого взаимодействия с чем-либо вне самого класса. –

ответ

2

Проблема «Истекшая страница» вызвана стратегией рендеринга структуры. По умолчанию Wicket использует стратегию redirect-after-post для рендеринга страницы. Поэтому, если сеанс недействителен где-то на странице, следующий запрос на получение всегда будет показывать сообщение «Страница с истекшим сроком», потому что сеанс больше не существует.

Простое решение заключается в изменении стратегии визуализации в методе инициализации приложения:

@Override 
protected void init() { 
    super.init(); 
    getRequestCycleSettings().setRenderStrategy(RenderStrategy.ONE_PASS_RENDER); 
} 

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

+1

Другое решение, которое позволяет мне использовать стратегию рендеринга по умолчанию: Включить AjaxLazyLoadPanel на последней странице и аннулировать сеанс внутри метода getLazyLoadComponent(). Я думаю, что это лучше, чем переход на стратегию ONE_PASS_RENDER, потому что это не влияет на остальную часть моего приложения. –

1

Если вы аннулируете сеанс в конструкторе onAfterRender, это происходит до того, как страница будет отображаться, и именно поэтому вы видите страницу с истекшим сроком страницы.

Вы могли:

  • разместить кнопку на вашей странице сводки и после нажатия его недействительным сессию
  • в конструкторе резюме страницы нуль все данные сессии
  • вы могли бы привести к аннулированию сессии in onRemove, но я не знаю, сможете ли вы когда-нибудь добраться
  • или вы хотите отключить кнопку «Назад», а затем увидеть что-то вроде этого: http://blog.55minutes.com/2011/10/how-to-defeat-the-browser-back-button-cache/
+0

Спасибо за предложения Роберт. Кажется странным, что есть какая-либо ссылка на сеанс после onAfterRender(). Каким-то образом Wicket все еще нуждается в ней даже после рендеринга страницы. –

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