You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Matthias Keller <ma...@ergon.ch> on 2011/11/02 07:51:30 UTC

How to clear PageMap in Wicket 1.5?

Hi

Upon logging out we need to keep the current user's session to still 
display some information but we want to remove all previous pages from 
the PageMap (or however that is solved in Wicket 1.5 now) so that he 
cannot go back and continue on these pages.
In Wicket 1.4 we found a way to achieve that, basically with  
session.clear()  (plus  session.untouch(getPage())  ). In Wicket 1.5.2 
the clear() method ist still there, but only contains an empty TODO 
comment....

How do we clear the previous pages now so that if he goes back, the user 
receives a PageExpiredError ?

Thanks a lot

Matt


Re: How to clear PageMap in Wicket 1.5?

Posted by rebecca <ri...@gmail.com>.
hi dear wicket authors,

I must say that the functionallity Matt is describing is a very important
feature.
We use Matt's hack in all our wicket applications using wicket 1.4.
Please (please please) add this as an official feature to 1.5.

thanks
Rebecca

--
View this message in context: http://apache-wicket.1842946.n4.nabble.com/How-to-clear-PageMap-in-Wicket-1-5-tp3971976p4310158.html
Sent from the Users forum mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: How to clear PageMap in Wicket 1.5?

Posted by Matthias Keller <ma...@ergon.ch>.
Hi Martin

Sorry for the delay, I was busy with other things recently.
Of course you're right, that clearing all pages, including the NextPage 
isn't a smart thing and I don't wanna do that anyway.
But what I need is away to redirect to a new (non-bookmarkable!) 
NextPage while clearing all other stored page instances.
I'll try to illustrate a flow; the user starts on the homepage  
HomePage. All pages are stateful:
HomePage <click on a link> AnotherPage <click on the special Link we're 
talking about> NextPage.
Now, when the user is on the NextPage of course all links on THAT page 
do have to work as expected. But all previous page instances (of 
HomePage and AnotherPage) must be cleared from the page store, so that 
if the user clicks BACK in his browser (and would go back to 
AnotherPage), a PageExpiredException must be thrown.
I can achieve that with Session.replaceSession() BEFORE calling 
setResponsePage(new NextPage()) - but this method has additional 
semantics (change the session ID) which I may not want to have.
That's why I came to

getSessionStore().invalidate(RequestCycle.get().getRequest());

which *appears* to do what I want but due to the lack of knowledge of 
the session/pagestore internals I cannot say if it's correct or 
sufficient to do that...

So the important bit is, that when calling a usable  Session.clear(), 
the current page shall not be stored in the session/pagestore anymore...

Thanks

Matt

On 2011-11-03 09:05, Martin Grigorov wrote:
> Hi Matthias,
>
> On Thu, Nov 3, 2011 at 9:30 AM, Matthias Keller
> <ma...@ergon.ch>  wrote:
>> Hi Martin
>>
>> I see this is getting in the same direction as it was with Wicket 1.4 - it
>> just doesn't work as expected.
>> The method you propose results in the next page shown as expected and going
>> back is not possible anymore. But so is clicking on anything on the next
>> page then - those links seem to be invalid then too...
>>
>> The problem seems to be in the order of events:
>> 1) The flow wishes to invalidate all current pages, so calls Session.clear()
>> 2) Then the user is redirected to a new page with setResponsePage(new
>> NextPage())
>> 3) Then the request ends and if cleaning up is performed at this stage, it
>> doesn't know to keep the NextPage and its links but clean everything else
>>
>> No 3 could be addressed in wicket 1.4 using the internal untouch method to
>> tell wicket NOT to store that page anymore.
> One question: what should happen when the user is redirected to
> NextPage (because of setResponsePage(new NextPage())) and
> the user clicks on a Link ?
> Wicket will try to find the page to execute Link#onClick() but since
> the page is not stored Wicket will throw PageExpiredException.
> The same will happen if the user refreshes the page with F5.
> How do you handle that case ?
>
> Session.clear() removes all pages stored so far. If you use
> setResponsePage(anInstance) then a new page will be stored afterwards.
> If you really want to clear all pages even the NextPage instance then
> you can do:
>
> class MyRequestCycle extends RequestCycle {
>    private boolean fullClean;
>
>    public void fullClean() {
>      fullClean = true;
>    }
>
>    @Override
>    public void detach() {
>      super.detach();
>
>      if (fullClean) {
>         fullClean = false;
>         Session.get().clean();
>      }
>    }
> }
>
>> What appears to work is create a public method in my session which calls:
>>     getSessionStore().invalidate(RequestCycle.get().getRequest());
>>
>> This seems to work (and is part of what replaceSession() does) but I don't
>> know the internals of the new PageManager et al so I'm not sure if this is
>> already enough and correct?
>>
>> Matt
>>
>> On 2011-11-02 13:27, Martin Grigorov wrote:
>>> On Wed, Nov 2, 2011 at 2:09 PM, Matthias Keller
>>> <ma...@ergon.ch>    wrote:
>>>> Hi Martin
>>>>
>>>> Thanks for the quick reply.
>>>> The fix doesn't work for me though, I can still go back and press reload

>>>> or
>>>> do anything I like.
>>>> If I use session.replaceSession() it works as expected but as a side
>>>> effect
>>>> also changes the JSESSIONID which usually isn't what you want...
>>>>
>>>> I'm using it like that in an onClick event of a button (and the session
>>>> is
>>>> NOT temporary):
>>>>
>>>>         if (getSession().isTemporary() == false) {
>>>>             getSession().getPageManager().sessionExpired(getId());
>>>>         }
>>> This code does the same as in 1.4 with page maps.
>>> #untouchPage() as internal API in 1.4 and is not ported to 1.5.
>>>
>>> Try by override Session#detach() and do:
>>> super.detach();
>>> clear();
>>>
>>>>         setResponsePage(new ConfirmationPage(...));
>>>>
>>>> Maybe it could be some kind of special situation like it was in Wicket
>>>> 1.4
>>>> where I manually had to untouch the current page to avoid it still being
>>>> stored at the end of the request...?
>>>>
>>>> Matt
>>>>
>>>>
>>>> On 2011-11-02 10:40, Martin Grigorov wrote:
>>>>> I implemented the feature in the ticket Matt created.
>>>>> Please try it.
>>>>>
>>>>> On Wed, Nov 2, 2011 at 11:35 AM, Andrea Del Bene<ad...@ciseonweb.it>
>>>>>   wrote:
>>>>>> Have you tried session.invalidate()? If you have an
>>>>>> AuthenticatedWebSession
>>>>>> you can also use signOut()
>>>>>>> Hi
>>>>>>>
>>>>>>> Upon logging out we need to keep the current user's session to still
>>>>>>> display some information but we want to remove all previous pages from
>>>>>>> the
>>>>>>> PageMap (or however that is solved in Wicket 1.5 now) so that he
>>>>>>> cannot
>>>>>>> go
>>>>>>> back and continue on these pages.
>>>>>>> In Wicket 1.4 we found a way to achieve that, basically with
>>>>>>>   session.clear()  (plus  session.untouch(getPage())  ). In Wicket
>>>>>>> 1.5.2
>>>>>>> the
>>>>>>> clear() method ist still there, but only contains an empty TODO
>>>>>>> comment....
>>>>>>>
>>>>>>> How do we clear the previous pages now so that if he goes back, the
>>>>>>> user
>>>>>>> receives a PageExpiredError ?
>>>>>>>
>>>>>>> Thanks a lot
>>>>>>>
>>>>>>> Matt
>>
>>
>>
>
>


-- 
matthias.keller@ergon.ch  +41 44 268 83 98
Ergon Informatik AG, Kleinstrasse 15, CH-8008 Zürich
http://www.ergon.ch
______________________________________________________________
e r g o n    smart people - smart software



Re: How to clear PageMap in Wicket 1.5?

Posted by Martin Grigorov <mg...@apache.org>.
Hi Matthias,

On Thu, Nov 3, 2011 at 9:30 AM, Matthias Keller
<ma...@ergon.ch> wrote:
> Hi Martin
>
> I see this is getting in the same direction as it was with Wicket 1.4 - it
> just doesn't work as expected.
> The method you propose results in the next page shown as expected and going
> back is not possible anymore. But so is clicking on anything on the next
> page then - those links seem to be invalid then too...
>
> The problem seems to be in the order of events:
> 1) The flow wishes to invalidate all current pages, so calls Session.clear()
> 2) Then the user is redirected to a new page with setResponsePage(new
> NextPage())
> 3) Then the request ends and if cleaning up is performed at this stage, it
> doesn't know to keep the NextPage and its links but clean everything else
>
> No 3 could be addressed in wicket 1.4 using the internal untouch method to
> tell wicket NOT to store that page anymore.

One question: what should happen when the user is redirected to
NextPage (because of setResponsePage(new NextPage())) and
the user clicks on a Link ?
Wicket will try to find the page to execute Link#onClick() but since
the page is not stored Wicket will throw PageExpiredException.
The same will happen if the user refreshes the page with F5.
How do you handle that case ?

Session.clear() removes all pages stored so far. If you use
setResponsePage(anInstance) then a new page will be stored afterwards.
If you really want to clear all pages even the NextPage instance then
you can do:

class MyRequestCycle extends RequestCycle {
  private boolean fullClean;

  public void fullClean() {
    fullClean = true;
  }

  @Override
  public void detach() {
    super.detach();

    if (fullClean) {
       fullClean = false;
       Session.get().clean();
    }
  }
}

>
> What appears to work is create a public method in my session which calls:
>    getSessionStore().invalidate(RequestCycle.get().getRequest());
>
> This seems to work (and is part of what replaceSession() does) but I don't
> know the internals of the new PageManager et al so I'm not sure if this is
> already enough and correct?
>
> Matt
>
> On 2011-11-02 13:27, Martin Grigorov wrote:
>>
>> On Wed, Nov 2, 2011 at 2:09 PM, Matthias Keller
>> <ma...@ergon.ch>  wrote:
>>>
>>> Hi Martin
>>>
>>> Thanks for the quick reply.
>>> The fix doesn't work for me though, I can still go back and press reload
>>> or
>>> do anything I like.
>>> If I use session.replaceSession() it works as expected but as a side
>>> effect
>>> also changes the JSESSIONID which usually isn't what you want...
>>>
>>> I'm using it like that in an onClick event of a button (and the session
>>> is
>>> NOT temporary):
>>>
>>>        if (getSession().isTemporary() == false) {
>>>            getSession().getPageManager().sessionExpired(getId());
>>>        }
>>
>> This code does the same as in 1.4 with page maps.
>> #untouchPage() as internal API in 1.4 and is not ported to 1.5.
>>
>> Try by override Session#detach() and do:
>> super.detach();
>> clear();
>>
>>>        setResponsePage(new ConfirmationPage(...));
>>>
>>> Maybe it could be some kind of special situation like it was in Wicket
>>> 1.4
>>> where I manually had to untouch the current page to avoid it still being
>>> stored at the end of the request...?
>>>
>>> Matt
>>>
>>>
>>> On 2011-11-02 10:40, Martin Grigorov wrote:
>>>>
>>>> I implemented the feature in the ticket Matt created.
>>>> Please try it.
>>>>
>>>> On Wed, Nov 2, 2011 at 11:35 AM, Andrea Del Bene<ad...@ciseonweb.it>
>>>>  wrote:
>>>>>
>>>>> Have you tried session.invalidate()? If you have an
>>>>> AuthenticatedWebSession
>>>>> you can also use signOut()
>>>>>>
>>>>>> Hi
>>>>>>
>>>>>> Upon logging out we need to keep the current user's session to still
>>>>>> display some information but we want to remove all previous pages from
>>>>>> the
>>>>>> PageMap (or however that is solved in Wicket 1.5 now) so that he
>>>>>> cannot
>>>>>> go
>>>>>> back and continue on these pages.
>>>>>> In Wicket 1.4 we found a way to achieve that, basically with
>>>>>>  session.clear()  (plus  session.untouch(getPage())  ). In Wicket
>>>>>> 1.5.2
>>>>>> the
>>>>>> clear() method ist still there, but only contains an empty TODO
>>>>>> comment....
>>>>>>
>>>>>> How do we clear the previous pages now so that if he goes back, the
>>>>>> user
>>>>>> receives a PageExpiredError ?
>>>>>>
>>>>>> Thanks a lot
>>>>>>
>>>>>> Matt
>
>
>
>



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: How to clear PageMap in Wicket 1.5?

Posted by Matthias Keller <ma...@ergon.ch>.
Hi Martin

I see this is getting in the same direction as it was with Wicket 1.4 - 
it just doesn't work as expected.
The method you propose results in the next page shown as expected and 
going back is not possible anymore. But so is clicking on anything on 
the next page then - those links seem to be invalid then too...

The problem seems to be in the order of events:
1) The flow wishes to invalidate all current pages, so calls Session.clear()
2) Then the user is redirected to a new page with setResponsePage(new 
NextPage())
3) Then the request ends and if cleaning up is performed at this stage, 
it doesn't know to keep the NextPage and its links but clean everything else

No 3 could be addressed in wicket 1.4 using the internal untouch method 
to tell wicket NOT to store that page anymore.

What appears to work is create a public method in my session which calls:
     getSessionStore().invalidate(RequestCycle.get().getRequest());

This seems to work (and is part of what replaceSession() does) but I 
don't know the internals of the new PageManager et al so I'm not sure if 
this is already enough and correct?

Matt

On 2011-11-02 13:27, Martin Grigorov wrote:
> On Wed, Nov 2, 2011 at 2:09 PM, Matthias Keller
> <ma...@ergon.ch>  wrote:
>> Hi Martin
>>
>> Thanks for the quick reply.
>> The fix doesn't work for me though, I can still go back and press reload or
>> do anything I like.
>> If I use session.replaceSession() it works as expected but as a side effect
>> also changes the JSESSIONID which usually isn't what you want...
>>
>> I'm using it like that in an onClick event of a button (and the session is
>> NOT temporary):
>>
>>         if (getSession().isTemporary() == false) {
>>             getSession().getPageManager().sessionExpired(getId());
>>         }
> This code does the same as in 1.4 with page maps.
> #untouchPage() as internal API in 1.4 and is not ported to 1.5.
>
> Try by override Session#detach() and do:
> super.detach();
> clear();
>
>>         setResponsePage(new ConfirmationPage(...));
>>
>> Maybe it could be some kind of special situation like it was in Wicket 1.4
>> where I manually had to untouch the current page to avoid it still being
>> stored at the end of the request...?
>>
>> Matt
>>
>>
>> On 2011-11-02 10:40, Martin Grigorov wrote:
>>> I implemented the feature in the ticket Matt created.
>>> Please try it.
>>>
>>> On Wed, Nov 2, 2011 at 11:35 AM, Andrea Del Bene<ad...@ciseonweb.it>
>>>   wrote:
>>>> Have you tried session.invalidate()? If you have an
>>>> AuthenticatedWebSession
>>>> you can also use signOut()
>>>>> Hi
>>>>>
>>>>> Upon logging out we need to keep the current user's session to still
>>>>> display some information but we want to remove all previous pages from
>>>>> the
>>>>> PageMap (or however that is solved in Wicket 1.5 now) so that he cannot
>>>>> go
>>>>> back and continue on these pages.
>>>>> In Wicket 1.4 we found a way to achieve that, basically with
>>>>>   session.clear()  (plus  session.untouch(getPage())  ). In Wicket 1.5.2
>>>>> the
>>>>> clear() method ist still there, but only contains an empty TODO
>>>>> comment....
>>>>>
>>>>> How do we clear the previous pages now so that if he goes back, the user
>>>>> receives a PageExpiredError ?
>>>>>
>>>>> Thanks a lot
>>>>>
>>>>> Matt




Re: How to clear PageMap in Wicket 1.5?

Posted by Martin Grigorov <mg...@apache.org>.
On Wed, Nov 2, 2011 at 2:09 PM, Matthias Keller
<ma...@ergon.ch> wrote:
> Hi Martin
>
> Thanks for the quick reply.
> The fix doesn't work for me though, I can still go back and press reload or
> do anything I like.
> If I use session.replaceSession() it works as expected but as a side effect
> also changes the JSESSIONID which usually isn't what you want...
>
> I'm using it like that in an onClick event of a button (and the session is
> NOT temporary):
>
>        if (getSession().isTemporary() == false) {
>            getSession().getPageManager().sessionExpired(getId());
>        }

This code does the same as in 1.4 with page maps.
#untouchPage() as internal API in 1.4 and is not ported to 1.5.

Try by override Session#detach() and do:
super.detach();
clear();

>
>        setResponsePage(new ConfirmationPage(...));
>
> Maybe it could be some kind of special situation like it was in Wicket 1.4
> where I manually had to untouch the current page to avoid it still being
> stored at the end of the request...?
>
> Matt
>
>
> On 2011-11-02 10:40, Martin Grigorov wrote:
>>
>> I implemented the feature in the ticket Matt created.
>> Please try it.
>>
>> On Wed, Nov 2, 2011 at 11:35 AM, Andrea Del Bene<ad...@ciseonweb.it>
>>  wrote:
>>>
>>> Have you tried session.invalidate()? If you have an
>>> AuthenticatedWebSession
>>> you can also use signOut()
>>>>
>>>> Hi
>>>>
>>>> Upon logging out we need to keep the current user's session to still
>>>> display some information but we want to remove all previous pages from
>>>> the
>>>> PageMap (or however that is solved in Wicket 1.5 now) so that he cannot
>>>> go
>>>> back and continue on these pages.
>>>> In Wicket 1.4 we found a way to achieve that, basically with
>>>>  session.clear()  (plus  session.untouch(getPage())  ). In Wicket 1.5.2
>>>> the
>>>> clear() method ist still there, but only contains an empty TODO
>>>> comment....
>>>>
>>>> How do we clear the previous pages now so that if he goes back, the user
>>>> receives a PageExpiredError ?
>>>>
>>>> Thanks a lot
>>>>
>>>> Matt
>
>
>



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: How to clear PageMap in Wicket 1.5?

Posted by Matthias Keller <ma...@ergon.ch>.
Hi Martin

Thanks for the quick reply.
The fix doesn't work for me though, I can still go back and press reload 
or do anything I like.
If I use session.replaceSession() it works as expected but as a side 
effect also changes the JSESSIONID which usually isn't what you want...

I'm using it like that in an onClick event of a button (and the session 
is NOT temporary):

         if (getSession().isTemporary() == false) {
             getSession().getPageManager().sessionExpired(getId());
         }

         setResponsePage(new ConfirmationPage(...));

Maybe it could be some kind of special situation like it was in Wicket 
1.4 where I manually had to untouch the current page to avoid it still 
being stored at the end of the request...?

Matt


On 2011-11-02 10:40, Martin Grigorov wrote:
> I implemented the feature in the ticket Matt created.
> Please try it.
>
> On Wed, Nov 2, 2011 at 11:35 AM, Andrea Del Bene<ad...@ciseonweb.it>  wrote:
>> Have you tried session.invalidate()? If you have an AuthenticatedWebSession
>> you can also use signOut()
>>> Hi
>>>
>>> Upon logging out we need to keep the current user's session to still
>>> display some information but we want to remove all previous pages from the
>>> PageMap (or however that is solved in Wicket 1.5 now) so that he cannot go
>>> back and continue on these pages.
>>> In Wicket 1.4 we found a way to achieve that, basically with
>>>   session.clear()  (plus  session.untouch(getPage())  ). In Wicket 1.5.2 the
>>> clear() method ist still there, but only contains an empty TODO comment....
>>>
>>> How do we clear the previous pages now so that if he goes back, the user
>>> receives a PageExpiredError ?
>>>
>>> Thanks a lot
>>>
>>> Matt



Re: How to clear PageMap in Wicket 1.5?

Posted by Martin Grigorov <mg...@apache.org>.
I implemented the feature in the ticket Matt created.
Please try it.

On Wed, Nov 2, 2011 at 11:35 AM, Andrea Del Bene <ad...@ciseonweb.it> wrote:
> Have you tried session.invalidate()? If you have an AuthenticatedWebSession
> you can also use signOut()
>>
>> Hi
>>
>> Upon logging out we need to keep the current user's session to still
>> display some information but we want to remove all previous pages from the
>> PageMap (or however that is solved in Wicket 1.5 now) so that he cannot go
>> back and continue on these pages.
>> In Wicket 1.4 we found a way to achieve that, basically with
>>  session.clear()  (plus  session.untouch(getPage())  ). In Wicket 1.5.2 the
>> clear() method ist still there, but only contains an empty TODO comment....
>>
>> How do we clear the previous pages now so that if he goes back, the user
>> receives a PageExpiredError ?
>>
>> Thanks a lot
>>
>> Matt
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: How to clear PageMap in Wicket 1.5?

Posted by Andrea Del Bene <ad...@ciseonweb.it>.
Have you tried session.invalidate()? If you have an 
AuthenticatedWebSession you can also use signOut()
> Hi
>
> Upon logging out we need to keep the current user's session to still 
> display some information but we want to remove all previous pages from 
> the PageMap (or however that is solved in Wicket 1.5 now) so that he 
> cannot go back and continue on these pages.
> In Wicket 1.4 we found a way to achieve that, basically with  
> session.clear()  (plus  session.untouch(getPage())  ). In Wicket 1.5.2 
> the clear() method ist still there, but only contains an empty TODO 
> comment....
>
> How do we clear the previous pages now so that if he goes back, the 
> user receives a PageExpiredError ?
>
> Thanks a lot
>
> Matt
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org