PageParameterAwareMountedMapper.javaMountedMapper 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.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:
processHybrid() auf, um den Standard-Handler zu erhaltenPageExpiredException ab – falls die zwischengespeicherte Seite abgelaufen ist, wird auf processBookmarkable() zurückgegriffen, das eine neue Seite erstelltRenderPageRequestHandler 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 AnfrageprocessBookmarkable() weitergeleitet – eine neue, zustandslose Seiteninstanz mit den korrekten ParameternWickets 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.
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.
| Commit | Was wurde geändert |
|---|---|
868d6abb7 bis ceb63e8a1 | Sechs 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. |