Domanda

Sono di fronte a un problema di strano e non sono in grado di scoprire la causa principale. Ecco la dichiarazione del problema.

Ho una pagina arazzo con un pulsante di logout. Quando clicco sul pulsante di logout, il codice qui sotto viene eseguito e ottengo l'eccezione.

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

L'eccezione è:

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)

Ragazzi qualche idea? Saluti,
Mahendra

È stato utile?

Soluzione

Grazie per il vostro tempo e le vostre osservazioni! Con qualche buona discussione ho finalmente trovato la soluzione e stanno condividendo con voi.

Nel mio caso di richiesta / risposta che passa RMOpenEJBFilter. Così, quando ho invalidata la seduta nel mio codice allora si è schiantato in RMOpenEJBFilter perché il suo processo di codice interno sulla sessione.

Quindi, ecco la mia soluzione.

  1. Ho creato un filtro nominato come LogOutFilter.
  2. in web.xml ho messo prima di RMOpenEJBFilter (ai fini di filtro concatenamento).
  3. nel mio codice di logout io pongo una variabile in sessione

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

  1. in modo che quando si fa clic sul pulsante di logout si imposta l'attributo di sessione, poi va al RMOpenEJBFilter dove si elabora la richiesta (sino alla sessione tempo non è invalidato). Ora il controllo va al LogOutFilter in cui ho fatto un controllo per invalidare la sessione.

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

E bene ora sta funzionando.

La speranza mia soluzione è abbastanza buono per essere accettato.

Non esitate a contattarmi per qualsiasi chiarimento.

Saluti,
Mahendra Athneria
Mumbai, India

Altri suggerimenti

Credo che u non ha bisogno del filtro. basta aggiungere seguente azione per logout.

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

        return Login.class;
    } 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top