EN · DE · RU · FR · ES

#2775: PageParameterAwareMountedMapper.java

projectforge-wicket/src/main/java/de/micromata/wicket/request/mapper/PageParameterAwareMountedMapper.java Mappeur de requêtes Wicket (routage d'URL) · projectforge-wicket/src/main/java/de/micromata/wicket/request/mapper/PageParameterAwareMountedMapper.java 126 lignes · 47 code · 71 commentaires · 8 vides
Un correctif critique du routage d'URL Wicket qui résout un défaut subtil dans le comportement par défaut de MountedMapper. 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é.

Architecture

Stratégie de remplacement

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 :

  1. Appelle le processHybrid() parent pour obtenir le gestionnaire par défaut
  2. Capture PageExpiredException — si la page mise en cache a expiré, revient à processBookmarkable() qui crée une nouvelle page
  3. Si le parent a retourné un RenderPageRequestHandler 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 actuelle
  4. Si l'une des comparaisons échoue, redirige vers processBookmarkable() — une nouvelle instance de page sans état avec les paramètres corrects

Le problème fondamental

Le 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.

Utilisation du montage

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.

Historique Git

CommitCe qui a changé
868d6abb7 à ceb63e8a1Six 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.