Hi Allen, This is improved in 1.5-SNAPSHOT and will be part of 1.5.6. See https://issues.apache.org/jira/browse/WICKET-4488 and https://issues.apache.org/jira/browse/WICKET-4441
On Mon, Apr 23, 2012 at 4:59 AM, Allen Gilbert <[email protected]> wrote: > While trying to understand what causes StalePageExceptions (using Wicket > 1.5.4), I discovered a strange situation that can occur > when DefaultExceptionMapper handles a StalePageException. I decided to ping > the mailing list before creating a JIRA issue in case I'm misunderstanding > intended behavior. > > Consider this scenario: > > 1) A user logs in and loads a few different pages, eventually landing on > Page A. At this point, Page A's version is "5", e.g. /some/path/pageA?5 > 2) The user opens a new tab and loads Page B > 3) The user logs out (or their session times out) while on Page B > 4) The user logs back in and interacts with Page B, performing page-level > actions that increase the render count of the page, until Page B's version > is "5." At this point, a link listener url on Page B looks something like > /some/path/pageB?5-3.ILinkListener-someLink > 5) The user switches back to their old Page A tab > 6) The user clicks an action link (with a listener url > like /some/path/pageA?5-1.ILinkListener-someLink) on Page A > 7) Wicket throws a StalePageException because the page with version "5" has > a render count of 3, not 1 > 8) At this point, the strange thing occurs: instead of rendering a new > version of Page A, Wicket renders Page B. Thus, even though the user > attempted to do something on Page A, they are now looking at Page B. > > Digging into the code, it seems this is due to the implementation of > PageProvider.getStoredPage(int pageId). Notably, the javadoc for the > method states, "If pageClass is specified then compares it against the > stored instance class and returns the found instance only if they match." > In the example, pageClass would be PageA.class, > but storedPageInstance.getClass() would return PageB.class (the page with > id=5 in the newest session). However, even though pageClass > and storedPageInstance.getClass() aren't equal, the method still > returns storedPageInstance. > > In this case, shouldn't getStoredPage() should return null, prompting a > fresh instantiation of PageA.class? That way, when the user clicks the > stale link on Page A, they'll get a fresh rendering of Page A. > > Thanks for your help! > > -Allen -- Martin Grigorov jWeekend Training, Consulting, Development http://jWeekend.com --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
