You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Peter Stavrinides <P....@albourne.com> on 2009/03/09 10:30:05 UTC

Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed

>I have a filer to trim off the long jsession IDs from url
You can do so, but IMHO that should never be necessary, the session id is encoded into the URL only once, and then removed by the container (that is if you have cookies enabled in the browser). It provides a backwards compatibility mechanism and support for devices that can't support cookies. The only other reason that it might be encoded request after request is if you are creating a new session with each request (a configuration problem that can happen for instance when you have a problem with your front end - Apache mod_rewrite), which is not mapping your cookie correctly to your back end (Tomcat / Jetty etc).

Returning true is interpreted as a terminator for the request by your container, false allows the request to continue naturally, so if you call something like session.invalidate(), immediatly after call return true; to terminate, invalidate acts like a finalize on the request, so anything that trys to do something with it will cause an IllegalStateException.

The problem I was having the other day related to lazy loading, after an invalidate, I could not initialize a new page because a new session could not be instantiated at that point, simply setting the property before the invalidate fixed that, the second issue was the use of the Response Tapestry service rather than HttpServletResponse, where the later cannot be tracked by Tapestry so there is a timing issue (like a race condition), hence using the first was the solution.

Cheers,
Peter


----- Original Message -----
From: "Dave Dombrosky" <do...@gmail.com>
To: "Tapestry users" <us...@tapestry.apache.org>
Sent: Monday, 9 March, 2009 05:46:16 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a  session after the response has been committed

I'm also getting an exception after a session.invalidate() from an
ActionLink and can confirm that it works in Jetty but fails in Tomcat.
 It would be nice to know if there is a workaround.  Here's the
exception:

java.lang.IllegalStateException: Cannot create a session after the
response has been committed
	org.apache.catalina.connector.Request.doGetSession(Unknown Source)
	org.apache.catalina.connector.Request.getSession(Unknown Source)
	org.apache.catalina.connector.RequestFacade.getSession(Unknown Source)
	javax.servlet.http.HttpServletRequestWrapper.getSession(Unknown Source)
	org.apache.tapestry5.internal.services.RequestImpl.getSession(RequestImpl.java:99)
	$Request_11fda81101a.getSession($Request_11fda81101a.java)
	$Request_11fda810fec.getSession($Request_11fda810fec.java)
	org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy.requestDidComplete(SessionApplicationStatePersistenceStrategy.java:126)
	org.apache.tapestry5.internal.services.EndOfRequestListenerHubImpl.fire(EndOfRequestListenerHubImpl.java:40)
	...


On Fri, Mar 6, 2009 at 6:47 AM, Angelo Chen <an...@yahoo.com.hk> wrote:
>
> I have same error, the reason is, I have a filer to trim off the long
> jsession IDs from url, solution was, I stopped using invalidate in the T5
> side. however, according to Peter, this happens when you have a sendRedirect
> without a matching return true in a dispatcher, you can try that.
>
>
> Harald Geritzer-2 wrote:
>>
>>
>> hi all,
>>
>> the following code causes IllegalStateExceptions on tomcat 6 while using
>> jetty it works without
>> errors. any idea?
>>
>>       public URL onActionFromLinkLogoff() {
>>               User user = userDao.load(getVisit().getUserId());
>>               auditDao.audit(AuditType.LOGOFF, user);
>>
>>               String startPage = getVisit().getStartPage();
>>               Session session = request.getSession(false);
>>
>>               componentResources.discardPersistentFieldChanges();
>>
>>               if (null != session)
>>                       session.invalidate();
>>               try {
>>                       return new URL(startPage);
>>               } catch (MalformedURLException e) {
>>                       return null;
>>               }
>>       }
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>>
>
> --
> View this message in context: http://www.nabble.com/-T5-5.0.18--java.lang.IllegalStateException%3A-Cannot-create-a-session-after-the-response-has-been-committed-tp22369307p22369465.html
> Sent from the Tapestry - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>

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


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


Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed

Posted by Dave Dombrosky <do...@gmail.com>.
Looks like this is a bug in 5.0.18 that has been fixed in 5.1.0.0. See
http://issues.apache.org/jira/browse/TAP5-413 for details.

-Dave


On Mon, Mar 9, 2009 at 6:11 PM, Dave Dombrosky <do...@gmail.com> wrote:
> Sorry I may have jumped the gun.  I thought I had this fixed, but I
> must have been testing on Jetty and not Tomcat.  Still broken in
> Tomcat.
>
> -Dave
>
>
> On Mon, Mar 9, 2009 at 5:49 PM, Dave Dombrosky <do...@gmail.com> wrote:
>> Peter, returning true "works", but it does not redirect the user to a
>> different page than they were on.  Normally you want the user to be
>> sent to a different page if they are in a secure area of the site when
>> logging off.
>>
>> I was just able to fix my problem with a similar situation.  I was
>> trying to return my home page as a Class, but Tapestry did not like
>> initializing the page after the session had been invalidated.  To
>> solve this, I injected the page using @InjectPage, and then used that
>> value in the method return.  The key here seems to be getting the page
>> initialized before the session is invalidated.
>>
>> Now for Harald's case, this might be difficult to implement.  It looks
>> like he's got a dynamic start page that he wants a user to be returned
>> to.  Somehow he's going to have to get an instance of the page and
>> return that, instead of returning a URL.  I'm not quite sure how to do
>> that here, but maybe someone else can chime in.
>>
>> -Dave
>>
>>
>> On Mon, Mar 9, 2009 at 5:46 AM, Peter Stavrinides
>> <P....@albourne.com> wrote:
>>> Sorry here is the rest of it:
>>>
>>>  public Object onActionFromLinkLogoff() {
>>>               User user = userDao.load(getVisit().getUserId());
>>>               auditDao.audit(AuditType.LOGOFF, user);
>>>
>>>               String startPage = getVisit().getStartPage();
>>>                componentResources.discardPersistentFieldChanges();
>>>
>>>               if (null != session)
>>>                       request.getSession(false).invalidate();
>>> return true;
>>>               try {
>>>                       return new URL(startPage);
>>>               } catch (MalformedURLException e) {
>>>                       return null;
>>>               }
>>>       }
>>>
>>>
>>> --
>>> If you are not an intended recipient of this e-mail, please notify the sender, delete it and do not read, act upon, print, disclose, copy, retain or redistribute it. Please visit http://www.albourne.com/email.html for important additional terms relating to this e-mail.
>>>
>>> ----- Original Message -----
>>> From: "Peter Stavrinides" <P....@albourne.com>
>>> To: "Tapestry users" <us...@tapestry.apache.org>
>>> Sent: Monday, 9 March, 2009 11:30:05 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
>>> Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed
>>>
>>>>I have a filer to trim off the long jsession IDs from url
>>> You can do so, but IMHO that should never be necessary, the session id is encoded into the URL only once, and then removed by the container (that is if you have cookies enabled in the browser). It provides a backwards compatibility mechanism and support for devices that can't support cookies. The only other reason that it might be encoded request after request is if you are creating a new session with each request (a configuration problem that can happen for instance when you have a problem with your front end - Apache mod_rewrite), which is not mapping your cookie correctly to your back end (Tomcat / Jetty etc).
>>>
>>> Returning true is interpreted as a terminator for the request by your container, false allows the request to continue naturally, so if you call something like session.invalidate(), immediatly after call return true; to terminate, invalidate acts like a finalize on the request, so anything that trys to do something with it will cause an IllegalStateException.
>>>
>>> The problem I was having the other day related to lazy loading, after an invalidate, I could not initialize a new page because a new session could not be instantiated at that point, simply setting the property before the invalidate fixed that, the second issue was the use of the Response Tapestry service rather than HttpServletResponse, where the later cannot be tracked by Tapestry so there is a timing issue (like a race condition), hence using the first was the solution.
>>>
>>> Cheers,
>>> Peter
>>>
>>>
>>> ----- Original Message -----
>>> From: "Dave Dombrosky" <do...@gmail.com>
>>> To: "Tapestry users" <us...@tapestry.apache.org>
>>> Sent: Monday, 9 March, 2009 05:46:16 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
>>> Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a  session after the response has been committed
>>>
>>> I'm also getting an exception after a session.invalidate() from an
>>> ActionLink and can confirm that it works in Jetty but fails in Tomcat.
>>>  It would be nice to know if there is a workaround.  Here's the
>>> exception:
>>>
>>> java.lang.IllegalStateException: Cannot create a session after the
>>> response has been committed
>>>        org.apache.catalina.connector.Request.doGetSession(Unknown Source)
>>>        org.apache.catalina.connector.Request.getSession(Unknown Source)
>>>        org.apache.catalina.connector.RequestFacade.getSession(Unknown Source)
>>>        javax.servlet.http.HttpServletRequestWrapper.getSession(Unknown Source)
>>>        org.apache.tapestry5.internal.services.RequestImpl.getSession(RequestImpl.java:99)
>>>        $Request_11fda81101a.getSession($Request_11fda81101a.java)
>>>        $Request_11fda810fec.getSession($Request_11fda810fec.java)
>>>        org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy.requestDidComplete(SessionApplicationStatePersistenceStrategy.java:126)
>>>        org.apache.tapestry5.internal.services.EndOfRequestListenerHubImpl.fire(EndOfRequestListenerHubImpl.java:40)
>>>        ...
>>>
>>>
>>> On Fri, Mar 6, 2009 at 6:47 AM, Angelo Chen <an...@yahoo.com.hk> wrote:
>>>>
>>>> I have same error, the reason is, I have a filer to trim off the long
>>>> jsession IDs from url, solution was, I stopped using invalidate in the T5
>>>> side. however, according to Peter, this happens when you have a sendRedirect
>>>> without a matching return true in a dispatcher, you can try that.
>>>>
>>>>
>>>> Harald Geritzer-2 wrote:
>>>>>
>>>>>
>>>>> hi all,
>>>>>
>>>>> the following code causes IllegalStateExceptions on tomcat 6 while using
>>>>> jetty it works without
>>>>> errors. any idea?
>>>>>
>>>>>       public URL onActionFromLinkLogoff() {
>>>>>               User user = userDao.load(getVisit().getUserId());
>>>>>               auditDao.audit(AuditType.LOGOFF, user);
>>>>>
>>>>>               String startPage = getVisit().getStartPage();
>>>>>               Session session = request.getSession(false);
>>>>>
>>>>>               componentResources.discardPersistentFieldChanges();
>>>>>
>>>>>               if (null != session)
>>>>>                       session.invalidate();
>>>>>               try {
>>>>>                       return new URL(startPage);
>>>>>               } catch (MalformedURLException e) {
>>>>>                       return null;
>>>>>               }
>>>>>       }
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> View this message in context: http://www.nabble.com/-T5-5.0.18--java.lang.IllegalStateException%3A-Cannot-create-a-session-after-the-response-has-been-committed-tp22369307p22369465.html
>>>> Sent from the Tapestry - User mailing list archive at Nabble.com.
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>>
>>
>

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


Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed

Posted by Dave Dombrosky <do...@gmail.com>.
Sorry I may have jumped the gun.  I thought I had this fixed, but I
must have been testing on Jetty and not Tomcat.  Still broken in
Tomcat.

-Dave


On Mon, Mar 9, 2009 at 5:49 PM, Dave Dombrosky <do...@gmail.com> wrote:
> Peter, returning true "works", but it does not redirect the user to a
> different page than they were on.  Normally you want the user to be
> sent to a different page if they are in a secure area of the site when
> logging off.
>
> I was just able to fix my problem with a similar situation.  I was
> trying to return my home page as a Class, but Tapestry did not like
> initializing the page after the session had been invalidated.  To
> solve this, I injected the page using @InjectPage, and then used that
> value in the method return.  The key here seems to be getting the page
> initialized before the session is invalidated.
>
> Now for Harald's case, this might be difficult to implement.  It looks
> like he's got a dynamic start page that he wants a user to be returned
> to.  Somehow he's going to have to get an instance of the page and
> return that, instead of returning a URL.  I'm not quite sure how to do
> that here, but maybe someone else can chime in.
>
> -Dave
>
>
> On Mon, Mar 9, 2009 at 5:46 AM, Peter Stavrinides
> <P....@albourne.com> wrote:
>> Sorry here is the rest of it:
>>
>>  public Object onActionFromLinkLogoff() {
>>               User user = userDao.load(getVisit().getUserId());
>>               auditDao.audit(AuditType.LOGOFF, user);
>>
>>               String startPage = getVisit().getStartPage();
>>                componentResources.discardPersistentFieldChanges();
>>
>>               if (null != session)
>>                       request.getSession(false).invalidate();
>> return true;
>>               try {
>>                       return new URL(startPage);
>>               } catch (MalformedURLException e) {
>>                       return null;
>>               }
>>       }
>>
>>
>> --
>> If you are not an intended recipient of this e-mail, please notify the sender, delete it and do not read, act upon, print, disclose, copy, retain or redistribute it. Please visit http://www.albourne.com/email.html for important additional terms relating to this e-mail.
>>
>> ----- Original Message -----
>> From: "Peter Stavrinides" <P....@albourne.com>
>> To: "Tapestry users" <us...@tapestry.apache.org>
>> Sent: Monday, 9 March, 2009 11:30:05 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
>> Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed
>>
>>>I have a filer to trim off the long jsession IDs from url
>> You can do so, but IMHO that should never be necessary, the session id is encoded into the URL only once, and then removed by the container (that is if you have cookies enabled in the browser). It provides a backwards compatibility mechanism and support for devices that can't support cookies. The only other reason that it might be encoded request after request is if you are creating a new session with each request (a configuration problem that can happen for instance when you have a problem with your front end - Apache mod_rewrite), which is not mapping your cookie correctly to your back end (Tomcat / Jetty etc).
>>
>> Returning true is interpreted as a terminator for the request by your container, false allows the request to continue naturally, so if you call something like session.invalidate(), immediatly after call return true; to terminate, invalidate acts like a finalize on the request, so anything that trys to do something with it will cause an IllegalStateException.
>>
>> The problem I was having the other day related to lazy loading, after an invalidate, I could not initialize a new page because a new session could not be instantiated at that point, simply setting the property before the invalidate fixed that, the second issue was the use of the Response Tapestry service rather than HttpServletResponse, where the later cannot be tracked by Tapestry so there is a timing issue (like a race condition), hence using the first was the solution.
>>
>> Cheers,
>> Peter
>>
>>
>> ----- Original Message -----
>> From: "Dave Dombrosky" <do...@gmail.com>
>> To: "Tapestry users" <us...@tapestry.apache.org>
>> Sent: Monday, 9 March, 2009 05:46:16 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
>> Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a  session after the response has been committed
>>
>> I'm also getting an exception after a session.invalidate() from an
>> ActionLink and can confirm that it works in Jetty but fails in Tomcat.
>>  It would be nice to know if there is a workaround.  Here's the
>> exception:
>>
>> java.lang.IllegalStateException: Cannot create a session after the
>> response has been committed
>>        org.apache.catalina.connector.Request.doGetSession(Unknown Source)
>>        org.apache.catalina.connector.Request.getSession(Unknown Source)
>>        org.apache.catalina.connector.RequestFacade.getSession(Unknown Source)
>>        javax.servlet.http.HttpServletRequestWrapper.getSession(Unknown Source)
>>        org.apache.tapestry5.internal.services.RequestImpl.getSession(RequestImpl.java:99)
>>        $Request_11fda81101a.getSession($Request_11fda81101a.java)
>>        $Request_11fda810fec.getSession($Request_11fda810fec.java)
>>        org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy.requestDidComplete(SessionApplicationStatePersistenceStrategy.java:126)
>>        org.apache.tapestry5.internal.services.EndOfRequestListenerHubImpl.fire(EndOfRequestListenerHubImpl.java:40)
>>        ...
>>
>>
>> On Fri, Mar 6, 2009 at 6:47 AM, Angelo Chen <an...@yahoo.com.hk> wrote:
>>>
>>> I have same error, the reason is, I have a filer to trim off the long
>>> jsession IDs from url, solution was, I stopped using invalidate in the T5
>>> side. however, according to Peter, this happens when you have a sendRedirect
>>> without a matching return true in a dispatcher, you can try that.
>>>
>>>
>>> Harald Geritzer-2 wrote:
>>>>
>>>>
>>>> hi all,
>>>>
>>>> the following code causes IllegalStateExceptions on tomcat 6 while using
>>>> jetty it works without
>>>> errors. any idea?
>>>>
>>>>       public URL onActionFromLinkLogoff() {
>>>>               User user = userDao.load(getVisit().getUserId());
>>>>               auditDao.audit(AuditType.LOGOFF, user);
>>>>
>>>>               String startPage = getVisit().getStartPage();
>>>>               Session session = request.getSession(false);
>>>>
>>>>               componentResources.discardPersistentFieldChanges();
>>>>
>>>>               if (null != session)
>>>>                       session.invalidate();
>>>>               try {
>>>>                       return new URL(startPage);
>>>>               } catch (MalformedURLException e) {
>>>>                       return null;
>>>>               }
>>>>       }
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>>
>>>>
>>>>
>>>
>>> --
>>> View this message in context: http://www.nabble.com/-T5-5.0.18--java.lang.IllegalStateException%3A-Cannot-create-a-session-after-the-response-has-been-committed-tp22369307p22369465.html
>>> Sent from the Tapestry - User mailing list archive at Nabble.com.
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>

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


Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed

Posted by Dave Dombrosky <do...@gmail.com>.
Peter, returning true "works", but it does not redirect the user to a
different page than they were on.  Normally you want the user to be
sent to a different page if they are in a secure area of the site when
logging off.

I was just able to fix my problem with a similar situation.  I was
trying to return my home page as a Class, but Tapestry did not like
initializing the page after the session had been invalidated.  To
solve this, I injected the page using @InjectPage, and then used that
value in the method return.  The key here seems to be getting the page
initialized before the session is invalidated.

Now for Harald's case, this might be difficult to implement.  It looks
like he's got a dynamic start page that he wants a user to be returned
to.  Somehow he's going to have to get an instance of the page and
return that, instead of returning a URL.  I'm not quite sure how to do
that here, but maybe someone else can chime in.

-Dave


On Mon, Mar 9, 2009 at 5:46 AM, Peter Stavrinides
<P....@albourne.com> wrote:
> Sorry here is the rest of it:
>
>  public Object onActionFromLinkLogoff() {
>               User user = userDao.load(getVisit().getUserId());
>               auditDao.audit(AuditType.LOGOFF, user);
>
>               String startPage = getVisit().getStartPage();
>                componentResources.discardPersistentFieldChanges();
>
>               if (null != session)
>                       request.getSession(false).invalidate();
> return true;
>               try {
>                       return new URL(startPage);
>               } catch (MalformedURLException e) {
>                       return null;
>               }
>       }
>
>
> --
> If you are not an intended recipient of this e-mail, please notify the sender, delete it and do not read, act upon, print, disclose, copy, retain or redistribute it. Please visit http://www.albourne.com/email.html for important additional terms relating to this e-mail.
>
> ----- Original Message -----
> From: "Peter Stavrinides" <P....@albourne.com>
> To: "Tapestry users" <us...@tapestry.apache.org>
> Sent: Monday, 9 March, 2009 11:30:05 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
> Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed
>
>>I have a filer to trim off the long jsession IDs from url
> You can do so, but IMHO that should never be necessary, the session id is encoded into the URL only once, and then removed by the container (that is if you have cookies enabled in the browser). It provides a backwards compatibility mechanism and support for devices that can't support cookies. The only other reason that it might be encoded request after request is if you are creating a new session with each request (a configuration problem that can happen for instance when you have a problem with your front end - Apache mod_rewrite), which is not mapping your cookie correctly to your back end (Tomcat / Jetty etc).
>
> Returning true is interpreted as a terminator for the request by your container, false allows the request to continue naturally, so if you call something like session.invalidate(), immediatly after call return true; to terminate, invalidate acts like a finalize on the request, so anything that trys to do something with it will cause an IllegalStateException.
>
> The problem I was having the other day related to lazy loading, after an invalidate, I could not initialize a new page because a new session could not be instantiated at that point, simply setting the property before the invalidate fixed that, the second issue was the use of the Response Tapestry service rather than HttpServletResponse, where the later cannot be tracked by Tapestry so there is a timing issue (like a race condition), hence using the first was the solution.
>
> Cheers,
> Peter
>
>
> ----- Original Message -----
> From: "Dave Dombrosky" <do...@gmail.com>
> To: "Tapestry users" <us...@tapestry.apache.org>
> Sent: Monday, 9 March, 2009 05:46:16 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
> Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a  session after the response has been committed
>
> I'm also getting an exception after a session.invalidate() from an
> ActionLink and can confirm that it works in Jetty but fails in Tomcat.
>  It would be nice to know if there is a workaround.  Here's the
> exception:
>
> java.lang.IllegalStateException: Cannot create a session after the
> response has been committed
>        org.apache.catalina.connector.Request.doGetSession(Unknown Source)
>        org.apache.catalina.connector.Request.getSession(Unknown Source)
>        org.apache.catalina.connector.RequestFacade.getSession(Unknown Source)
>        javax.servlet.http.HttpServletRequestWrapper.getSession(Unknown Source)
>        org.apache.tapestry5.internal.services.RequestImpl.getSession(RequestImpl.java:99)
>        $Request_11fda81101a.getSession($Request_11fda81101a.java)
>        $Request_11fda810fec.getSession($Request_11fda810fec.java)
>        org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy.requestDidComplete(SessionApplicationStatePersistenceStrategy.java:126)
>        org.apache.tapestry5.internal.services.EndOfRequestListenerHubImpl.fire(EndOfRequestListenerHubImpl.java:40)
>        ...
>
>
> On Fri, Mar 6, 2009 at 6:47 AM, Angelo Chen <an...@yahoo.com.hk> wrote:
>>
>> I have same error, the reason is, I have a filer to trim off the long
>> jsession IDs from url, solution was, I stopped using invalidate in the T5
>> side. however, according to Peter, this happens when you have a sendRedirect
>> without a matching return true in a dispatcher, you can try that.
>>
>>
>> Harald Geritzer-2 wrote:
>>>
>>>
>>> hi all,
>>>
>>> the following code causes IllegalStateExceptions on tomcat 6 while using
>>> jetty it works without
>>> errors. any idea?
>>>
>>>       public URL onActionFromLinkLogoff() {
>>>               User user = userDao.load(getVisit().getUserId());
>>>               auditDao.audit(AuditType.LOGOFF, user);
>>>
>>>               String startPage = getVisit().getStartPage();
>>>               Session session = request.getSession(false);
>>>
>>>               componentResources.discardPersistentFieldChanges();
>>>
>>>               if (null != session)
>>>                       session.invalidate();
>>>               try {
>>>                       return new URL(startPage);
>>>               } catch (MalformedURLException e) {
>>>                       return null;
>>>               }
>>>       }
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>>> For additional commands, e-mail: users-help@tapestry.apache.org
>>>
>>>
>>>
>>
>> --
>> View this message in context: http://www.nabble.com/-T5-5.0.18--java.lang.IllegalStateException%3A-Cannot-create-a-session-after-the-response-has-been-committed-tp22369307p22369465.html
>> Sent from the Tapestry - User mailing list archive at Nabble.com.
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>

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


Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed

Posted by Peter Stavrinides <P....@albourne.com>.
Sorry here is the rest of it:

 public Object onActionFromLinkLogoff() {
               User user = userDao.load(getVisit().getUserId());
               auditDao.audit(AuditType.LOGOFF, user);

               String startPage = getVisit().getStartPage();
                componentResources.discardPersistentFieldChanges();

               if (null != session)
                       request.getSession(false).invalidate();
return true;
               try {
                       return new URL(startPage);
               } catch (MalformedURLException e) {
                       return null;
               }
       }


-- 
If you are not an intended recipient of this e-mail, please notify the sender, delete it and do not read, act upon, print, disclose, copy, retain or redistribute it. Please visit http://www.albourne.com/email.html for important additional terms relating to this e-mail.

----- Original Message -----
From: "Peter Stavrinides" <P....@albourne.com>
To: "Tapestry users" <us...@tapestry.apache.org>
Sent: Monday, 9 March, 2009 11:30:05 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a session after the response has been committed

>I have a filer to trim off the long jsession IDs from url
You can do so, but IMHO that should never be necessary, the session id is encoded into the URL only once, and then removed by the container (that is if you have cookies enabled in the browser). It provides a backwards compatibility mechanism and support for devices that can't support cookies. The only other reason that it might be encoded request after request is if you are creating a new session with each request (a configuration problem that can happen for instance when you have a problem with your front end - Apache mod_rewrite), which is not mapping your cookie correctly to your back end (Tomcat / Jetty etc).

Returning true is interpreted as a terminator for the request by your container, false allows the request to continue naturally, so if you call something like session.invalidate(), immediatly after call return true; to terminate, invalidate acts like a finalize on the request, so anything that trys to do something with it will cause an IllegalStateException.

The problem I was having the other day related to lazy loading, after an invalidate, I could not initialize a new page because a new session could not be instantiated at that point, simply setting the property before the invalidate fixed that, the second issue was the use of the Response Tapestry service rather than HttpServletResponse, where the later cannot be tracked by Tapestry so there is a timing issue (like a race condition), hence using the first was the solution.

Cheers,
Peter


----- Original Message -----
From: "Dave Dombrosky" <do...@gmail.com>
To: "Tapestry users" <us...@tapestry.apache.org>
Sent: Monday, 9 March, 2009 05:46:16 GMT +02:00 Athens, Beirut, Bucharest, Istanbul
Subject: Re: [T5 5.0.18] java.lang.IllegalStateException: Cannot create a  session after the response has been committed

I'm also getting an exception after a session.invalidate() from an
ActionLink and can confirm that it works in Jetty but fails in Tomcat.
 It would be nice to know if there is a workaround.  Here's the
exception:

java.lang.IllegalStateException: Cannot create a session after the
response has been committed
	org.apache.catalina.connector.Request.doGetSession(Unknown Source)
	org.apache.catalina.connector.Request.getSession(Unknown Source)
	org.apache.catalina.connector.RequestFacade.getSession(Unknown Source)
	javax.servlet.http.HttpServletRequestWrapper.getSession(Unknown Source)
	org.apache.tapestry5.internal.services.RequestImpl.getSession(RequestImpl.java:99)
	$Request_11fda81101a.getSession($Request_11fda81101a.java)
	$Request_11fda810fec.getSession($Request_11fda810fec.java)
	org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy.requestDidComplete(SessionApplicationStatePersistenceStrategy.java:126)
	org.apache.tapestry5.internal.services.EndOfRequestListenerHubImpl.fire(EndOfRequestListenerHubImpl.java:40)
	...


On Fri, Mar 6, 2009 at 6:47 AM, Angelo Chen <an...@yahoo.com.hk> wrote:
>
> I have same error, the reason is, I have a filer to trim off the long
> jsession IDs from url, solution was, I stopped using invalidate in the T5
> side. however, according to Peter, this happens when you have a sendRedirect
> without a matching return true in a dispatcher, you can try that.
>
>
> Harald Geritzer-2 wrote:
>>
>>
>> hi all,
>>
>> the following code causes IllegalStateExceptions on tomcat 6 while using
>> jetty it works without
>> errors. any idea?
>>
>>       public URL onActionFromLinkLogoff() {
>>               User user = userDao.load(getVisit().getUserId());
>>               auditDao.audit(AuditType.LOGOFF, user);
>>
>>               String startPage = getVisit().getStartPage();
>>               Session session = request.getSession(false);
>>
>>               componentResources.discardPersistentFieldChanges();
>>
>>               if (null != session)
>>                       session.invalidate();
>>               try {
>>                       return new URL(startPage);
>>               } catch (MalformedURLException e) {
>>                       return null;
>>               }
>>       }
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>>
>
> --
> View this message in context: http://www.nabble.com/-T5-5.0.18--java.lang.IllegalStateException%3A-Cannot-create-a-session-after-the-response-has-been-committed-tp22369307p22369465.html
> Sent from the Tapestry - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>

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


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


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