Tapestry5 Logout exception
I am facing a strange issue and am not able to find out the root cause. Here is the problem statement.
I have one tapestry page with a logout button. When I click on the logout button, the code below is executed and I get the exception.
// method which called onclick of logout button.
@OnEvent(value = EventConstants.ACTION, component = "tlogout")
public Object logout()
{
request.getSession(false).invalidate();
return "Login";
}
Exception is:
INFO | net.awl.tapestry5.kawwa.services.KawwaModule.TabLocator | 2011-01-05 14:33:23,321
> Checking for any UPDATES
INFO | net.awl.bfi.websuite.services.AppModule.TimingFilter | 2011-01-05 14:33:23,352
> Request time: 31 ms
ERROR | org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/WebSuiteMoreaTapestry].[default] | 2011-01-05 14:33:23,352
> Servlet.service() for servlet default threw exception
java.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2221)
at org.apache.catalina.connector.Request.getSession(Request.java:2031)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:832)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:843)
at net.atos.xa.rm.jaas.openejb.web.RMOpenEJBFilter.doFilter(RMOpenEJBFilter.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.openejb.tomcat.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
开发者_如何学编程 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)
Guys any idea? Regards,
MahendraThanks for your time and your comments! With some good discussion I finally found the solution and are sharing it with you.
In my case request/response coming through RMOpenEJBFilter
. So, when I invalidated the session in my code then it crashed in RMOpenEJBFilter
because its internal code process on session.
So here is my solution.
- I created one Filter named as
LogOutFilter
. - in WEB.XML I put it before
RMOpenEJBFilter
(for the purpose of Filter Chaining). - in my logout code i am setting one variable in session
request.getSession(false).setAttribute("InvalidateSession", true);
- so when I click on the logout button it sets the session attribute, then goes to the
RMOpenEJBFilter
where it process the request (till the time session is not invalidated). Now control goes to theLogOutFilter
where I made a check to invalidate the session.
if (httpRequest.getSession(false) != null && httpRequest.getSession(false).getAttribute("InvalidateSession") != null) {
httpRequest.getSession(false).invalidate();
}
And now it's working fine.
Hope my solution is good enough to be accepted.
Feel free to contact me for any clarification.
Regards,
Mahendra Athneria
Mumbai, India
i think u don't need filter. just add following action for logout.
@OnEvent("Logout")
private Object onActionFromLogout() {
Session session = requestGlobals.getRequest().getSession(false);
if (session != null) {
session.invalidate();
}
return Login.class;
}
精彩评论