PageParameterAwareMountedMapper.javaMountedMapper. Когда пользователь вручную редактирует URL Wicket — например, меняет /User/4?15 на /User/5?15 — стандартный маппер отдаёт приоритет параметру ID страницы в запросе (?15) над параметрами пути (/5), в результате чего пользователь видит кэшированную страницу для пользователя 4 вместо новой страницы для пользователя 5. Этот пользовательский маппер обнаруживает несоответствия между параметрами кэшированной страницы и параметрами текущего запроса и перенаправляет на новый экземпляр страницы с возможностью закладки, когда они различаются, гарантируя, что URL всегда отражает актуальное отображаемое содержимое.Класс расширяет MountedMapper и переопределяет только processHybrid() — метод, который Wicket вызывает, когда у него есть как ID страницы (из кэшированной в сессии страницы), так и параметры пути (из URL). Переопределение:
processHybrid() для получения обработчика по умолчаниюPageExpiredException — если кэшированная страница устарела, возвращается к processBookmarkable(), который создаёт новую страницуRenderPageRequestHandler с PageProvider, содержащим экземпляр страницы, сравнивает: (a) класс страницы кэшированного экземпляра с запрошенным классом страницы и (b) параметры кэшированной страницы с параметрами текущего запросаprocessBookmarkable() — новый экземпляр страницы без состояния с правильными параметрамиСтандартный MountedMapper в Wicket реализует «гибридную» стратегию: если в URL присутствует ID страницы (либо как ?wicket:pageId=15, либо через сокращение ?15), загрузить сериализованную страницу из хранилища страниц; в противном случае создать новый экземпляр с возможностью закладки. Проблема в том, что после того, как сессия получила кэшированную страницу (например, ID страницы 15 для пользователя 4), последующие запросы с другими параметрами пути, но тем же ID страницы будут обслуживать кэшированную страницу — маппер никогда не сравнивает параметры пути с параметрами кэшированной страницы. Манипуляции с URL со стороны пользователя (или история браузера) могут привести к отображению устаревших данных.
Страницы монтируются в WicketApplication.init() с помощью mount(new PageParameterAwareMountedMapper("Home", HomePage.class)) вместо mountPage(). Это задокументировано в Javadoc самого класса с примером использования.
| Коммит | Что изменилось |
|---|---|
868d6abb7 – ceb63e8a1 | Шесть ежегодных обновлений заголовков авторских прав. Сама логика маппинга оставалась стабильной с момента создания — поведение маршрутизации URL оказалось корректным для всех смонтированных страниц при нескольких обновлениях версий Wicket. |