Try to invalidate the servlet session only in your SignOut page. Have a look at how it is done in the VLib example. In the beginResponse method of the Logout page the (VLib) engines logout method is called. This just sets a flag (killSession) in the engine. In the cleanupAfterRequest method, the engine then invalidates the session.
I did the logout the same way in my own application and it works fine. Hope that helps, Martin > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED]]On Behalf Of Luis > Neves > Sent: Donnerstag, 30. Mai 2002 18:32 > To: [EMAIL PROTECTED] > Subject: [Tapestry-developer] IllegalStateException > > > > > Hello all, > > This seems more like a Java question than a Tapestry question. > > I'm having some troubles in trying to provide a logout link > in my application. > > My first approach was to make a Direct component > > > <component id="signOut" type="Direct"> > <binding name="listener" property-path="listeners.directSignOut" /> > <field-binding name="stateful" field-name="Boolean.FALSE" /> > </component> > > with the code > > public void directSignOut(IRequestCycle cycle) > { > Visit visit = (Visit) page.getEngine().getVisit(); > visit.setUsername(null); > visit = null; > > try > { > HttpSession session = cycle.getRequestContext().getSession(); > > if (session != null) > session.invalidate(); > } > catch (IllegalStateException e) > { > // do nothing > } > finally > { > cycle.setPage("SignOut"); > } > > but all I get is this exception: > > 500 Servlet Exception > > java.lang.IllegalStateException: Can't call getAttribute() when session > is no longer valid. > at com.caucho.http.session.SessionImpl.getAttribute(SessionImpl.java:275) > at > net.sf.tapestry.ApplicationServlet.doService(ApplicationServlet.java:203) > at net.sf.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:161) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:126) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:103) > at > com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServ > let.java:9 > 6) > at com.caucho.server.http.Invocation.service(Invocation.java:311) > at > com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135) > at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:218) > at > com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:160) > at com.caucho.server.TcpConnection.run(TcpConnection.java:137) > at java.lang.Thread.run(Thread.java:536) > > > > I don't understand why the IllegalStateException doesn't get > caught. > After playing with this for a while and getting nowhere. > I tried to make a SignOutService, the code follows: > > > <component id="signOut" type="Service"> > <field-binding name="service" > field-name="tapestryCIO.SignOutService.SIGN_OUT"/> > <static-binding name="context">SignOut</static-binding> > </component> > > > public class SignOutService extends AbstractService > { > public static final String SIGN_OUT = "signout"; > > public Gesture buildGesture( > IRequestCycle cycle, > IComponent component, > String[] parameters) > { > if (parameters == null || parameters.length != 1) > throw new ApplicationRuntimeException("SignOut service requires one > parameter."); > > return assembleGesture(cycle, SIGN_OUT, null, parameters, true); > } > > public boolean service( > IEngineServiceView engine, > IRequestCycle cycle, > ResponseOutputStream output) > throws RequestCycleException, ServletException, IOException > { > > String[] parameters = getParameters(cycle.getRequestContext()); > String PAGE_TO_GO_WHEN_SIGN_OFF = parameters[0]; > > RequestContext context = cycle.getRequestContext(); > > HttpSession session = context.getSession(); > > if (session != null) > { > try > { > session.invalidate(); > cycle.setPage(PAGE_TO_GO_WHEN_SIGN_OFF); > } > catch (IllegalStateException ex) > { > // Do Nothing > } > } > return true; > > } > > public String getName() > { > return SIGN_OUT; > } > } > > But I get the exact same IllegalStateException. > > > I can make the code work if instead of > > cycle.setPage(PAGE_TO_GO_WHEN_SIGN_OFF); > > i use > > context.redirect("tapestryCIO/?context=" + PAGE_TO_GO_WHEN_SIGN_OFF + > "&service=page"); > > but this seems against the Tapestry way of doing things. > > I must be doing something terribly wrong, but I don't now what. > I'm using Resin 2.1.1 if it matters. > > Any help will be appreciated. > > > Luis Neves > > > _______________________________________________________________ > > Don't miss the 2002 Sprint PCS Application Developer's Conference > August 25-28 in Las Vegas -- http://devcon.sprintpcs.com/adp/index.cfm > > _______________________________________________ > Tapestry-developer mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/tapestry-developer > _______________________________________________________________ Don't miss the 2002 Sprint PCS Application Developer's Conference August 25-28 in Las Vegas -- http://devcon.sprintpcs.com/adp/index.cfm _______________________________________________ Tapestry-developer mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/tapestry-developer
