2011-01-05 12 views
2

Ich stehe vor einem seltsamen Problem und bin nicht in der Lage, die Ursache herauszufinden. Hier ist die Problemstellung.Tapestry5 Logout-Ausnahme

Ich habe eine Tapisserie-Seite mit einem Logout-Button. Wenn ich auf den Logout-Button klicke, wird der folgende Code ausgeführt und ich bekomme die Ausnahme.

// method which called onclick of logout button. 
@OnEvent(value = EventConstants.ACTION, component = "tlogout") 
public Object logout() 
{ 
    request.getSession(false).invalidate(); 
    return "Login"; 
} 

Ausnahme ist:

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) 

Jungs irgendeine Idee? Grüße,
Mahendra

+0

als Methode in dem Stack-Trace nicht erscheint, scheint es in Ordnung auszuführen, aber 'net.atos.xa.rm.jaas.openejb.web.RMOpenEJBFilter' eine Sitzung zu verwenden/erstellen versucht, nach Sie haben es ungültig gemacht, was fehlschlägt. Erfolgt die Ausnahme auf die gleiche Anfrage wie die Abmeldung, oder ist es nach der Umleitung auf die Anmeldeseite? – Henning

+0

Henning ich denke, es ist für die gleiche Anfrage wie die Abmeldung. weil ich versucht habe, system.out.print in @SetupRender-Methode der Anmeldeseite zu setzen, aber es hat nichts auf der Konsole gedruckt.Der nächste Punkt ist, dass ich net.atos.xa.rm.jaas.openejb.web.RMOpenEJBFilter doFilter-Methode überprüft und festgestellt habe, dass es einige Attribute von der Sitzung erhält, und deshalb bekomme ich einen Fehler. aber es ist ein Filter, also wird er nach jeder Anfrage/Antwort aufgerufen. Also bedeutet es, dass ich die Sitzung nicht ungültig machen kann? –

+0

ein Filter kann es tun, bevor oder nachdem die Anfrage verarbeitet wird. vielleicht müssen Sie openejb benachrichtigen, dass die Sitzung ungültig ist. Ich würde mir den Quellcode, die Dokumente usw. ansehen. Ich glaube nicht, dass es sich um ein Problem mit dem Wandteppich handelt. tagging incase openejb Leute haben Ideen. – pstanton

Antwort

1

Vielen Dank für Ihre Zeit und Ihre Kommentare! Mit einer guten Diskussion habe ich endlich die Lösung gefunden und teile sie mit Ihnen.

In meinem Fall Anfrage/Antwort kommt durch RMOpenEJBFilter. Also, wenn ich die Sitzung in meinem Code ungültig gemacht, dann stürzte es in RMOpenEJBFilter wegen seiner internen Code Prozess bei Sitzung.

Also hier ist meine Lösung.

  1. Ich habe einen Filter namens LogOutFilter erstellt.
  2. in WEB.XML Ich lege es vor RMOpenEJBFilter (zum Zwecke der Filter Chaining).
  3. in meinem Logout-Code Ich gründe eine Variable in der Sitzung

request.getSession(false).setAttribute("InvalidateSession", true);

  1. so, wenn ich auf die Schaltfläche Abmelden klicken Sie, um die Sitzung Attribut legt, geht dann auf die RMOpenEJBFilter wo sie den Prozess Anfrage (bis die Sitzung nicht ungültig ist). Jetzt geht die Kontrolle an die LogOutFilter, wo ich eine Überprüfung vorgenommen habe, um die Sitzung ungültig zu machen.

if (httpRequest.getSession(false) != null && httpRequest.getSession(false).getAttribute("InvalidateSession") != null) { httpRequest.getSession(false).invalidate(); }

und arbeitet jetzt ist es in Ordnung.

Ich hoffe, meine Lösung ist gut genug, um akzeptiert zu werden.

Fühlen Sie sich frei, mich für eine Klarstellung zu kontaktieren.

Grüße,
Mahendra Athneria
Mumbai, Indien

+0

ich bin sicher, dass würde funktionieren, aber ich würde erwarten, dass openejb eine Möglichkeit hätte, die Situation zu vermeiden ... – pstanton

+0

ja du hast Recht. Aber das ist nicht in meiner Kontrolle, deshalb habe ich meinen eigenen Filter erstellt, um das Problem zu lösen. –

0

ich denke, u-Filter nicht brauchen. Fügen Sie einfach folgende Aktion zum Abmelden hinzu.

@OnEvent("Logout") 
    private Object onActionFromLogout() { 
     Session session = requestGlobals.getRequest().getSession(false); 
     if (session != null) { 
      session.invalidate(); 
     } 

     return Login.class; 
    }