PageParameterAwareMountedMapper.javaMountedMapper. Cuando un usuario edita manualmente una URL de Wicket — por ejemplo, cambiando /User/4?15 a /User/5?15 — el mapeador predeterminado prioriza el parámetro de consulta de ID de página (?15) sobre los parámetros de ruta (/5), lo que provoca que el usuario vea la página en caché para el usuario 4 en lugar de una página nueva para el usuario 5. Este mapeador personalizado detecta discrepancias entre los parámetros de la página en caché y los parámetros de la solicitud actual, y redirige a una nueva instancia de página marcable cuando difieren, asegurando que la URL refleje siempre el contenido mostrado real.La clase extiende MountedMapper y anula solo processHybrid() — el método que Wicket llama cuando tiene tanto un ID de página (de una página en caché de sesión) como parámetros de ruta (de la URL). La anulación:
processHybrid() padre para obtener el manejador predeterminadoPageExpiredException — si la página en caché ha expirado, recurre a processBookmarkable() que crea una página nuevaRenderPageRequestHandler con un PageProvider que tiene una instancia de página, compara: (a) la clase de página de la instancia en caché vs. la clase de página solicitada, y (b) los parámetros de página en caché vs. los parámetros de solicitud actualprocessBookmarkable() — una instancia de página nueva y sin estado con los parámetros correctosEl MountedMapper de Wicket implementa una estrategia "híbrida": si existe un ID de página en la URL (ya sea como ?wicket:pageId=15 o mediante la abreviatura ?15), carga la página serializada del almacén de páginas; de lo contrario, crea una nueva instancia marcable. El problema es que una vez que una sesión tiene una página en caché (por ejemplo, ID de página 15 para el usuario 4), las solicitudes posteriores con diferentes parámetros de ruta pero el mismo ID de página servirán la página en caché — el mapeador nunca compara los parámetros de ruta con los parámetros de la página en caché. La manipulación de URL por parte de los usuarios (o el historial del navegador) mostraría datos obsoletos.
Las páginas se montan en WicketApplication.init() usando mount(new PageParameterAwareMountedMapper("Home", HomePage.class)) en lugar de mountPage(). Esto está documentado en el propio Javadoc de la clase con un ejemplo de uso.
| Commit | Qué cambió |
|---|---|
868d6abb7 a ceb63e8a1 | Seis actualizaciones anuales de encabezado de copyright. La lógica de mapeo en sí ha sido estable desde su creación — el comportamiento de enrutamiento URL ha demostrado ser correcto para todas las páginas montadas a través de múltiples actualizaciones de versión de Wicket. |