EN · DE · RU · FR · ES

#2775: PageParameterAwareMountedMapper.java

projectforge-wicket/src/main/java/de/micromata/wicket/request/mapper/PageParameterAwareMountedMapper.java Wicket Request Mapper (URL-Routing) · projectforge-wicket/src/main/java/de/micromata/wicket/request/mapper/PageParameterAwareMountedMapper.java 126 Zeilen · 47 Code · 71 Kommentare · 8 leer
Eine kritische Wicket-URL-Routing-Korrektur, die einen subtilen Fehler im Standardverhalten von MountedMapper behebt. Wenn ein Benutzer manuell eine Wicket-URL bearbeitet – zum Beispiel /User/4?15 in /User/5?15 ändert – priorisiert der Standard-Mapper den Seiten-ID-Abfrageparameter (?15) gegenüber den Pfadparametern (/5), sodass der Benutzer die zwischengespeicherte Seite für Benutzer 4 sieht, anstatt einer neuen Seite für Benutzer 5. Dieser benutzerdefinierte Mapper erkennt Abweichungen zwischen den Parametern der zwischengespeicherten Seite und den Parametern der aktuellen Anfrage und leitet bei Unterschieden zu einer frischen, als Lesezeichen speicherbaren Seiteninstanz weiter, sodass die URL stets den tatsächlich angezeigten Inhalt widerspiegelt.

Architektur

Überschreibungsstrategie

Die Klasse erweitert MountedMapper und überschreibt nur processHybrid() – die Methode, die Wicket aufruft, wenn sowohl eine Seiten-ID (aus einer sitzungsgespeicherten Seite) als auch Pfadparameter (aus der URL) vorliegen. Die Überschreibung:

  1. Ruft die parent processHybrid() auf, um den Standard-Handler zu erhalten
  2. Fängt PageExpiredException ab – falls die zwischengespeicherte Seite abgelaufen ist, wird auf processBookmarkable() zurückgegriffen, das eine neue Seite erstellt
  3. Wenn die parent-Methode einen RenderPageRequestHandler mit einem PageProvider zurückgibt, der eine Seiteninstanz enthält, vergleicht sie: (a) die Seitenklasse der zwischengespeicherten Instanz mit der angeforderten Seitenklasse und (b) die Parameter der zwischengespeicherten Seite mit den Parametern der aktuellen Anfrage
  4. Wenn einer der Vergleiche fehlschlägt, wird zu processBookmarkable() weitergeleitet – eine neue, zustandslose Seiteninstanz mit den korrekten Parametern

Das eigentliche Problem

Wickets MountedMapper implementiert eine „Hybrid“-Strategie: Wenn eine Seiten-ID in der URL vorhanden ist (entweder als ?wicket:pageId=15 oder über die Kurzform ?15), wird die serialisierte Seite aus dem Seiten-Store geladen; andernfalls wird eine neue, als Lesezeichen speicherbare Instanz erstellt. Das Problem ist, dass die zwischengespeicherte Seite ausgeliefert wird, sobald eine Sitzung eine zwischengespeicherte Seite hat (z. B. Seiten-ID 15 für Benutzer 4) und nachfolgende Anfragen mit anderen Pfadparametern, aber derselben Seiten-ID eingehen – der Mapper vergleicht niemals die Pfadparameter mit den Parametern der zwischengespeicherten Seite. Manuelle URL-Änderungen durch Benutzer (oder der Browserverlauf) würden veraltete Daten anzeigen.

Verwendung beim Mounten

Seiten werden in WicketApplication.init() mit mount(new PageParameterAwareMountedMapper("Home", HomePage.class)) anstelle von mountPage() gemountet. Dies ist im eigenen Javadoc der Klasse mit einem Verwendungsbeispiel dokumentiert.

Git-Verlauf

CommitWas wurde geändert
868d6abb7 bis ceb63e8a1Sechs jährliche Aktualisierungen der Copyright-Header. Die Mapping-Logik selbst ist seit ihrer Erstellung stabil – das URL-Routing-Verhalten hat sich bei allen gemounteten Seiten über mehrere Wicket-Versions-Upgrades hinweg als korrekt erwiesen.