PageParameterAwareMountedMapper.javaMountedMapper. Lorsqu'un utilisateur modifie manuellement une URL Wicket — par exemple en changeant /User/4?15 en /User/5?15 — le mappeur par défaut priorise le paramètre de requête d'ID de page (?15) par rapport aux paramètres de chemin (/5), ce qui fait que l'utilisateur voit la page mise en cache pour l'utilisateur 4 au lieu d'une nouvelle page pour l'utilisateur 5. Ce mappeur personnalisé détecte les incohérences entre les paramètres de la page mise en cache et les paramètres de la requête actuelle, et redirige vers une nouvelle instance de page signet lorsque ceux-ci diffèrent, garantissant que l'URL reflète toujours le contenu réellement affiché.La classe étend MountedMapper et ne remplace que processHybrid() — la méthode que Wicket appelle lorsqu'il possède à la fois un ID de page (provenant d'une page mise en cache en session) et des paramètres de chemin (provenant de l'URL). Le remplacement :
processHybrid() parent pour obtenir le gestionnaire par défautPageExpiredException — si la page mise en cache a expiré, revient à processBookmarkable() qui crée une nouvelle pageRenderPageRequestHandler avec un PageProvider qui possède une instance de page, compare : (a) la classe de page de l'instance mise en cache par rapport à la classe de page demandée, et (b) les paramètres de la page mise en cache par rapport aux paramètres de la requête actuelleprocessBookmarkable() — une nouvelle instance de page sans état avec les paramètres correctsLe MountedMapper de Wicket implémente une stratégie « hybride » : si un ID de page existe dans l'URL (soit sous la forme ?wicket:pageId=15 soit via le raccourci ?15), charger la page sérialisée depuis le magasin de pages ; sinon créer une nouvelle instance signet. Le problème est qu'une fois qu'une session a une page mise en cache (par exemple l'ID de page 15 pour l'utilisateur 4), les requêtes ultérieures avec des paramètres de chemin différents mais le même ID de page serviront la page mise en cache — le mappeur ne compare jamais les paramètres de chemin avec les paramètres de la page mise en cache. La manipulation d'URL par les utilisateurs (ou l'historique du navigateur) afficherait des données obsolètes.
Les pages sont montées dans WicketApplication.init() en utilisant mount(new PageParameterAwareMountedMapper("Home", HomePage.class)) au lieu de mountPage(). Ceci est documenté dans le Javadoc de la classe avec un exemple d'utilisation.
| Commit | Ce qui a changé |
|---|---|
868d6abb7 à ceb63e8a1 | Six mises à jour annuelles des en-têtes de copyright. La logique de mappage elle-même est restée stable depuis sa création — le comportement de routage d'URL s'est avéré correct pour toutes les pages montées à travers plusieurs mises à niveau de version de Wicket. |