Мы пишем приложение с использованием Wicket, использующего AJAX. В приложении есть главное окно с двумя iFrames. Первый iFrame показывает страницу с картой (Google Maps). Второй iFrame показывает DataTable.
Главное окно всегда видно. Есть страницы, которые открываются в собственных окнах (всплывающих окнах). Окна повторно используются для одной и той же страницы, например ссылка-A будет повторно использовать одно и то же всплывающее окно, если оно уже открыто для этой ссылки.
Проблема в том, что когда мы начинаем «комбинировать» вызовы AJAX с загрузкой новых страниц, мы начинаем получать PageExpiredException
-s для вызовов AJAX. Загрузка страниц (без AJAX) работает нормально, проблема заключается в вызовах AJAX. Ниже приводится типичный сценарий:
- Щелкните ссылку-A: откроется страница A во всплывающем окне.
- Щелкните ссылку-A 50 раз: при этом страница A откроется 50 раз, используя одно и то же всплывающее окно.
- Обновите DataTable в главном окне с помощью AJAX: это вызовет
PageExpiredException
. - Это максимальный размер файлового окна для этого http-сеанса. После его достижения Wicket начинает заменять самую старую версию страницы. В какой-то момент этот порог достигается, и страница с версией 1 (начальная страница) удаляется, а вместо нее записывается страница с версией N. Позже вызов Ajax пытается найти страницу, содержащую компонент с этим поведением ajax, и этот поиск не выполняется.
Все это может произойти всего через одну минуту после входа в систему (новый сеанс), то есть сеанс все еще действителен.
Мы не знаем точно, в чем проблема, но нам удалось «отложить» получение этого исключения, увеличив значение maxSizePerPageSession
в DefaultPageManagerProvider
. Если посмотреть на исходный код Wicket, то в конце концов, это значение используется DataStore
/ PageWindowManager
.
Мы не думаем, что это лучшее решение, и хотели бы понять, в чем проблема, чтобы мы могли решить ее лучше.
Мы используем Wicket 1.5-RC2.
Это трассировка стека:
Авторизуйтесь и загрузите главную страницу.