You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2020/11/06 17:38:54 UTC

[wicket] 01/01: WICKET-6847 onEndRequest before flush

This is an automated email from the ASF dual-hosted git repository.

svenmeier pushed a commit to branch WICKET-6847-onEndRequest-before-flush
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit 15a6cedfb8b855c004b2ece201d9eac063ef770e
Author: Sven Meier <sv...@apache.org>
AuthorDate: Fri Nov 6 18:36:16 2020 +0100

    WICKET-6847 onEndRequest before flush
    
    allows RequestPageStore to check for stateful pages
---
 pom.xml                                              | 12 ++++++++++++
 .../src/main/java/org/apache/wicket/Application.java |  6 ++++++
 .../java/org/apache/wicket/page/IPageManager.java    |  6 ++++++
 .../java/org/apache/wicket/page/PageManager.java     |  6 ++++++
 .../apache/wicket/pageStore/DelegatingPageStore.java |  6 ++++++
 .../java/org/apache/wicket/pageStore/IPageStore.java |  9 +++++++++
 .../apache/wicket/pageStore/RequestPageStore.java    | 19 ++++++++++++++-----
 .../apache/wicket/request/cycle/RequestCycle.java    | 20 ++++++++++----------
 8 files changed, 69 insertions(+), 15 deletions(-)

diff --git a/pom.xml b/pom.xml
index 0c7cfd5..4e0c912 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1133,6 +1133,18 @@
 						<comparisonVersion>9.0.0</comparisonVersion>
 						<failOnError>true</failOnError>
 						<logResults>true</logResults>
+						<ignored>
+							<difference>
+								<differenceType>7012</differenceType>
+								<className>org/apache/wicket/page/IPageManager</className>
+								<method>void end()</method>
+							</difference>
+							<difference>
+								<differenceType>7012</differenceType>
+								<className>org/apache/wicket/pageStore/IPageStore</className>
+								<method>void end(org.apache.wicket.pageStore.IPageContext)</method>
+							</difference>
+						</ignored>
 					</configuration>
 					<executions>
 						<execution>
diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java b/wicket-core/src/main/java/org/apache/wicket/Application.java
index 78fd57f..fa4ce29 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Application.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
@@ -1567,6 +1567,12 @@ public abstract class Application implements UnboundListener, IEventSink, IMetad
 		requestCycle.getListeners().add(new IRequestCycleListener()
 		{
 			@Override
+			public void onEndRequest(RequestCycle cycle)
+			{
+				internalGetPageManager().end();
+			}
+			
+			@Override
 			public void onDetach(final RequestCycle requestCycle)
 			{
 				internalGetPageManager().detach();
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
index c675cd9..ef6094a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
+++ b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
@@ -73,6 +73,12 @@ public interface IPageManager
 	void clear();
 
 	/**
+	 * End the request.
+	 */
+	default void end() {
+	}
+	
+	/**
 	 * Detach at end of request.
 	 */
 	void detach();
diff --git a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
index 642b3c1..02bf13c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
+++ b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
@@ -80,6 +80,12 @@ public class PageManager implements IPageManager
 	}
 	
 	@Override
+	public void end()
+	{
+		store.end(createPageContext());
+	}
+	
+	@Override
 	public void detach()
 	{
 		store.detach(createPageContext());
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
index 5ec3a79..3402b2c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
@@ -76,6 +76,12 @@ public abstract class DelegatingPageStore implements IPageStore
 	}
 	
 	@Override
+	public void end(IPageContext context)
+	{
+		delegate.end(context);
+	}
+	
+	@Override
 	public void detach(IPageContext context)
 	{
 		delegate.detach(context);
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
index 3872c8a..19f4079 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
@@ -94,6 +94,15 @@ public interface IPageStore
 	IManageablePage getPage(IPageContext context, int id);
 
 	/**
+	 * End the current context.
+	 * 
+	 * @param context
+	 */
+	default void end(IPageContext context)
+	{
+	}
+
+	/**
 	 * Detach from the current context.
 	 * 
 	 * @param context
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
index 54dc9da..d5c4d78 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
@@ -59,11 +59,6 @@ public class RequestPageStore extends DelegatingPageStore
 	@Override
 	public void addPage(IPageContext context, IManageablePage page)
 	{
-		// make sure an HTTP session is bound before committing the response
-		if (isPageStateless(page) == false)
-		{
-			context.getSessionId(true);
-		}
 		getRequestData(context).add(page);
 	}
 
@@ -92,6 +87,20 @@ public class RequestPageStore extends DelegatingPageStore
 	}
 	
 	@Override
+	public void end(IPageContext context)
+	{
+		RequestData requestData = getRequestData(context);
+		for (IManageablePage page : requestData.pages())
+		{
+			if (isPageStateless(page) == false)
+			{
+				// last opportunity to create a session
+				context.getSessionId(true);
+			}
+		}
+	}
+	
+	@Override
 	public void detach(IPageContext context)
 	{
 		RequestData requestData = getRequestData(context);
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
index b9f9841..d913a92 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
@@ -261,6 +261,16 @@ public class RequestCycle implements IRequestCycle, IEventSink, IMetadataContext
 		}
 		finally
 		{
+			try
+			{
+				onEndRequest();
+				listeners.onEndRequest(this);
+			}
+			catch (RuntimeException e)
+			{
+				log.error("Exception occurred during onEndRequest", e);
+			}
+
 			set(null);
 		}
 
@@ -648,16 +658,6 @@ public class RequestCycle implements IRequestCycle, IEventSink, IMetadataContext
 	{
 		try
 		{
-			onEndRequest();
-			listeners.onEndRequest(this);
-		}
-		catch (RuntimeException e)
-		{
-			log.error("Exception occurred during onEndRequest", e);
-		}
-
-		try
-		{
 			requestHandlerExecutor.detach();
 		}
 		catch (RuntimeException exception)


Re: [wicket] 01/01: WICKET-6847 onEndRequest before flush

Posted by Sven Meier <sv...@meiers.net>.
Thanks,

>+                       if (isPageStateless(page) == false)
>+                       {
>+                               // last opportunity to create a session
>+                               context.getSessionId(true);
>
>break ?

good point.


>+        * End the current context.
>+        *
>+        * @param context
>+        */
>+       default void end(IPageContext context)
>
>again endRequest(IPageContext) ?

  
I thought about that, but IMHO this method name fits better with the other methods.
But I don't care too much about the name either.

Regards
Sven



On 09.11.20 07:15, Martin Grigorov wrote:
> Hi,
>
> Few small comments inline.
>
> On Fri, Nov 6, 2020 at 7:38 PM <sv...@apache.org> wrote:
>
>> This is an automated email from the ASF dual-hosted git repository.
>>
>> svenmeier pushed a commit to branch WICKET-6847-onEndRequest-before-flush
>> in repository https://gitbox.apache.org/repos/asf/wicket.git
>>
>> commit 15a6cedfb8b855c004b2ece201d9eac063ef770e
>> Author: Sven Meier <sv...@apache.org>
>> AuthorDate: Fri Nov 6 18:36:16 2020 +0100
>>
>>      WICKET-6847 onEndRequest before flush
>>
>>      allows RequestPageStore to check for stateful pages
>> ---
>>   pom.xml                                              | 12 ++++++++++++
>>   .../src/main/java/org/apache/wicket/Application.java |  6 ++++++
>>   .../java/org/apache/wicket/page/IPageManager.java    |  6 ++++++
>>   .../java/org/apache/wicket/page/PageManager.java     |  6 ++++++
>>   .../apache/wicket/pageStore/DelegatingPageStore.java |  6 ++++++
>>   .../java/org/apache/wicket/pageStore/IPageStore.java |  9 +++++++++
>>   .../apache/wicket/pageStore/RequestPageStore.java    | 19
>> ++++++++++++++-----
>>   .../apache/wicket/request/cycle/RequestCycle.java    | 20
>> ++++++++++----------
>>   8 files changed, 69 insertions(+), 15 deletions(-)
>>
>> diff --git a/pom.xml b/pom.xml
>> index 0c7cfd5..4e0c912 100644
>> --- a/pom.xml
>> +++ b/pom.xml
>> @@ -1133,6 +1133,18 @@
>>
>> <comparisonVersion>9.0.0</comparisonVersion>
>>
>> <failOnError>true</failOnError>
>>
>> <logResults>true</logResults>
>> +                                               <ignored>
>> +                                                       <difference>
>> +
>>   <differenceType>7012</differenceType>
>> +
>>   <className>org/apache/wicket/page/IPageManager</className>
>> +
>>   <method>void end()</method>
>> +                                                       </difference>
>> +                                                       <difference>
>> +
>>   <differenceType>7012</differenceType>
>> +
>>   <className>org/apache/wicket/pageStore/IPageStore</className>
>> +
>>   <method>void end(org.apache.wicket.pageStore.IPageContext)</method>
>> +                                                       </difference>
>> +                                               </ignored>
>>                                          </configuration>
>>                                          <executions>
>>                                                  <execution>
>> diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java
>> b/wicket-core/src/main/java/org/apache/wicket/Application.java
>> index 78fd57f..fa4ce29 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/Application.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
>> @@ -1567,6 +1567,12 @@ public abstract class Application implements
>> UnboundListener, IEventSink, IMetad
>>                  requestCycle.getListeners().add(new IRequestCycleListener()
>>                  {
>>                          @Override
>> +                       public void onEndRequest(RequestCycle cycle)
>> +                       {
>> +                               internalGetPageManager().end();
>> +                       }
>> +
>> +                       @Override
>>                          public void onDetach(final RequestCycle
>> requestCycle)
>>                          {
>>                                  internalGetPageManager().detach();
>> diff --git
>> a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
>> b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
>> index c675cd9..ef6094a 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
>> @@ -73,6 +73,12 @@ public interface IPageManager
>>          void clear();
>>
>>          /**
>> +        * End the request.
>> +        */
>> +       default void end() {
>>
> endRequest() ?
>
>
>> +       }
>> +
>> +       /**
>>           * Detach at end of request.
>>           */
>>          void detach();
>> diff --git
>> a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
>> b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
>> index 642b3c1..02bf13c 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
>> @@ -80,6 +80,12 @@ public class PageManager implements IPageManager
>>          }
>>
>>          @Override
>> +       public void end()
>> +       {
>> +               store.end(createPageContext());
>> +       }
>> +
>> +       @Override
>>          public void detach()
>>          {
>>                  store.detach(createPageContext());
>> diff --git
>> a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
>> b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
>> index 5ec3a79..3402b2c 100644
>> ---
>> a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
>> +++
>> b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
>> @@ -76,6 +76,12 @@ public abstract class DelegatingPageStore implements
>> IPageStore
>>          }
>>
>>          @Override
>> +       public void end(IPageContext context)
>> +       {
>> +               delegate.end(context);
>> +       }
>> +
>> +       @Override
>>          public void detach(IPageContext context)
>>          {
>>                  delegate.detach(context);
>> diff --git
>> a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
>> b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
>> index 3872c8a..19f4079 100644
>> --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
>> +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
>> @@ -94,6 +94,15 @@ public interface IPageStore
>>          IManageablePage getPage(IPageContext context, int id);
>>
>>          /**
>> +        * End the current context.
>> +        *
>> +        * @param context
>> +        */
>> +       default void end(IPageContext context)
>>
> again endRequest(IPageContext) ?
>
>
>> +       {
>> +       }
>> +
>> +       /**
>>           * Detach from the current context.
>>           *
>>           * @param context
>> diff --git
>> a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
>> b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
>> index 54dc9da..d5c4d78 100644
>> ---
>> a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
>> +++
>> b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
>> @@ -59,11 +59,6 @@ public class RequestPageStore extends
>> DelegatingPageStore
>>          @Override
>>          public void addPage(IPageContext context, IManageablePage page)
>>          {
>> -               // make sure an HTTP session is bound before committing
>> the response
>> -               if (isPageStateless(page) == false)
>> -               {
>> -                       context.getSessionId(true);
>> -               }
>>                  getRequestData(context).add(page);
>>          }
>>
>> @@ -92,6 +87,20 @@ public class RequestPageStore extends
>> DelegatingPageStore
>>          }
>>
>>          @Override
>> +       public void end(IPageContext context)
>> +       {
>> +               RequestData requestData = getRequestData(context);
>> +               for (IManageablePage page : requestData.pages())
>> +               {
>> +                       if (isPageStateless(page) == false)
>> +                       {
>> +                               // last opportunity to create a session
>> +                               context.getSessionId(true);
>>
> break ?
>
>
>> +                       }
>> +               }
>> +       }
>> +
>> +       @Override
>>          public void detach(IPageContext context)
>>          {
>>                  RequestData requestData = getRequestData(context);
>> diff --git
>> a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
>> b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
>> index b9f9841..d913a92 100644
>> ---
>> a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
>> +++
>> b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
>> @@ -261,6 +261,16 @@ public class RequestCycle implements IRequestCycle,
>> IEventSink, IMetadataContext
>>                  }
>>                  finally
>>                  {
>> +                       try
>> +                       {
>> +                               onEndRequest();
>> +                               listeners.onEndRequest(this);
>> +                       }
>> +                       catch (RuntimeException e)
>> +                       {
>> +                               log.error("Exception occurred during
>> onEndRequest", e);
>> +                       }
>> +
>>                          set(null);
>>                  }
>>
>> @@ -648,16 +658,6 @@ public class RequestCycle implements IRequestCycle,
>> IEventSink, IMetadataContext
>>          {
>>                  try
>>                  {
>> -                       onEndRequest();
>> -                       listeners.onEndRequest(this);
>> -               }
>> -               catch (RuntimeException e)
>> -               {
>> -                       log.error("Exception occurred during
>> onEndRequest", e);
>> -               }
>> -
>> -               try
>> -               {
>>                          requestHandlerExecutor.detach();
>>                  }
>>                  catch (RuntimeException exception)
>>
>>

Re: [wicket] 01/01: WICKET-6847 onEndRequest before flush

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

Few small comments inline.

On Fri, Nov 6, 2020 at 7:38 PM <sv...@apache.org> wrote:

> This is an automated email from the ASF dual-hosted git repository.
>
> svenmeier pushed a commit to branch WICKET-6847-onEndRequest-before-flush
> in repository https://gitbox.apache.org/repos/asf/wicket.git
>
> commit 15a6cedfb8b855c004b2ece201d9eac063ef770e
> Author: Sven Meier <sv...@apache.org>
> AuthorDate: Fri Nov 6 18:36:16 2020 +0100
>
>     WICKET-6847 onEndRequest before flush
>
>     allows RequestPageStore to check for stateful pages
> ---
>  pom.xml                                              | 12 ++++++++++++
>  .../src/main/java/org/apache/wicket/Application.java |  6 ++++++
>  .../java/org/apache/wicket/page/IPageManager.java    |  6 ++++++
>  .../java/org/apache/wicket/page/PageManager.java     |  6 ++++++
>  .../apache/wicket/pageStore/DelegatingPageStore.java |  6 ++++++
>  .../java/org/apache/wicket/pageStore/IPageStore.java |  9 +++++++++
>  .../apache/wicket/pageStore/RequestPageStore.java    | 19
> ++++++++++++++-----
>  .../apache/wicket/request/cycle/RequestCycle.java    | 20
> ++++++++++----------
>  8 files changed, 69 insertions(+), 15 deletions(-)
>
> diff --git a/pom.xml b/pom.xml
> index 0c7cfd5..4e0c912 100644
> --- a/pom.xml
> +++ b/pom.xml
> @@ -1133,6 +1133,18 @@
>
> <comparisonVersion>9.0.0</comparisonVersion>
>
> <failOnError>true</failOnError>
>
> <logResults>true</logResults>
> +                                               <ignored>
> +                                                       <difference>
> +
>  <differenceType>7012</differenceType>
> +
>  <className>org/apache/wicket/page/IPageManager</className>
> +
>  <method>void end()</method>
> +                                                       </difference>
> +                                                       <difference>
> +
>  <differenceType>7012</differenceType>
> +
>  <className>org/apache/wicket/pageStore/IPageStore</className>
> +
>  <method>void end(org.apache.wicket.pageStore.IPageContext)</method>
> +                                                       </difference>
> +                                               </ignored>
>                                         </configuration>
>                                         <executions>
>                                                 <execution>
> diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java
> b/wicket-core/src/main/java/org/apache/wicket/Application.java
> index 78fd57f..fa4ce29 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/Application.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
> @@ -1567,6 +1567,12 @@ public abstract class Application implements
> UnboundListener, IEventSink, IMetad
>                 requestCycle.getListeners().add(new IRequestCycleListener()
>                 {
>                         @Override
> +                       public void onEndRequest(RequestCycle cycle)
> +                       {
> +                               internalGetPageManager().end();
> +                       }
> +
> +                       @Override
>                         public void onDetach(final RequestCycle
> requestCycle)
>                         {
>                                 internalGetPageManager().detach();
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
> b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
> index c675cd9..ef6094a 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/page/IPageManager.java
> @@ -73,6 +73,12 @@ public interface IPageManager
>         void clear();
>
>         /**
> +        * End the request.
> +        */
> +       default void end() {
>

endRequest() ?


> +       }
> +
> +       /**
>          * Detach at end of request.
>          */
>         void detach();
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
> b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
> index 642b3c1..02bf13c 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/page/PageManager.java
> @@ -80,6 +80,12 @@ public class PageManager implements IPageManager
>         }
>
>         @Override
> +       public void end()
> +       {
> +               store.end(createPageContext());
> +       }
> +
> +       @Override
>         public void detach()
>         {
>                 store.detach(createPageContext());
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
> b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
> index 5ec3a79..3402b2c 100644
> ---
> a/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
> +++
> b/wicket-core/src/main/java/org/apache/wicket/pageStore/DelegatingPageStore.java
> @@ -76,6 +76,12 @@ public abstract class DelegatingPageStore implements
> IPageStore
>         }
>
>         @Override
> +       public void end(IPageContext context)
> +       {
> +               delegate.end(context);
> +       }
> +
> +       @Override
>         public void detach(IPageContext context)
>         {
>                 delegate.detach(context);
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
> b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
> index 3872c8a..19f4079 100644
> --- a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
> +++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPageStore.java
> @@ -94,6 +94,15 @@ public interface IPageStore
>         IManageablePage getPage(IPageContext context, int id);
>
>         /**
> +        * End the current context.
> +        *
> +        * @param context
> +        */
> +       default void end(IPageContext context)
>

again endRequest(IPageContext) ?


> +       {
> +       }
> +
> +       /**
>          * Detach from the current context.
>          *
>          * @param context
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
> b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
> index 54dc9da..d5c4d78 100644
> ---
> a/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
> +++
> b/wicket-core/src/main/java/org/apache/wicket/pageStore/RequestPageStore.java
> @@ -59,11 +59,6 @@ public class RequestPageStore extends
> DelegatingPageStore
>         @Override
>         public void addPage(IPageContext context, IManageablePage page)
>         {
> -               // make sure an HTTP session is bound before committing
> the response
> -               if (isPageStateless(page) == false)
> -               {
> -                       context.getSessionId(true);
> -               }
>                 getRequestData(context).add(page);
>         }
>
> @@ -92,6 +87,20 @@ public class RequestPageStore extends
> DelegatingPageStore
>         }
>
>         @Override
> +       public void end(IPageContext context)
> +       {
> +               RequestData requestData = getRequestData(context);
> +               for (IManageablePage page : requestData.pages())
> +               {
> +                       if (isPageStateless(page) == false)
> +                       {
> +                               // last opportunity to create a session
> +                               context.getSessionId(true);
>

break ?


> +                       }
> +               }
> +       }
> +
> +       @Override
>         public void detach(IPageContext context)
>         {
>                 RequestData requestData = getRequestData(context);
> diff --git
> a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
> b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
> index b9f9841..d913a92 100644
> ---
> a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
> +++
> b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
> @@ -261,6 +261,16 @@ public class RequestCycle implements IRequestCycle,
> IEventSink, IMetadataContext
>                 }
>                 finally
>                 {
> +                       try
> +                       {
> +                               onEndRequest();
> +                               listeners.onEndRequest(this);
> +                       }
> +                       catch (RuntimeException e)
> +                       {
> +                               log.error("Exception occurred during
> onEndRequest", e);
> +                       }
> +
>                         set(null);
>                 }
>
> @@ -648,16 +658,6 @@ public class RequestCycle implements IRequestCycle,
> IEventSink, IMetadataContext
>         {
>                 try
>                 {
> -                       onEndRequest();
> -                       listeners.onEndRequest(this);
> -               }
> -               catch (RuntimeException e)
> -               {
> -                       log.error("Exception occurred during
> onEndRequest", e);
> -               }
> -
> -               try
> -               {
>                         requestHandlerExecutor.detach();
>                 }
>                 catch (RuntimeException exception)
>
>