2011-04-29 1 views
4

Lorsque j'essaie d'obtenir la session à partir de la requête, elle provoque une exception de pointeur NULL si la session a expiré. Ci-dessous est une partie du code. Je reçois une exception sur la troisième ligne.request.getSession (false) provoque java.lang.IllegalStateException

public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { 
HttpServletRequest httpReq = (HttpServletRequest) req; 
HttpSession session = httpReq.getSession(false); 

Et voici le stacktrace:

java.lang.IllegalStateException: getLastAccessedTime: Session already invalidated 
at org.apache.catalina.session.StandardSession.getLastAccessedTime(StandardSession.java:423) 
at org.apache.catalina.session.StandardSessionFacade.getLastAccessedTime(StandardSessionFacade.java:84) 
at com.myapp.admin.CustomerContext.valueUnbound(CustomerContext.java:806) 
at org.apache.catalina.session.StandardSession.removeAttributeInternal(StandardSession.java:1686) 
at org.apache.catalina.session.StandardSession.expire(StandardSession.java:801) 
at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:576) 
at org.apache.catalina.connector.Request.doGetSession(Request.java:2386) 
at org.apache.catalina.connector.Request.getSession(Request.java:2120) 
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:833) 
at com.myapp.ui.web.filter.ApplicationSessionFilter.doFilter(ApplicationSessionFilter.java:45) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at com.myapp.ui.web.filter.ErrorFilter.doFilter(ErrorFilter.java:42) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) 
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776) 
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705) 
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 
at java.lang.Thread.run(Thread.java:662) 
+0

Peut-être ne pas attaché à la session qu'il demande. car getSession (fasle) renvoie null si vous n'avez créé aucune session. – Ankit

+0

nous utilisons tomcat 6.0 – coder247

+2

montrent l'ensemble stacktrace – Bozho

Répondre

8

Ce n'est pas une exception Nullpointer.
Il s'agit d'une exception d'état non valide.

Cela se produit lorsque la session a été invalidée/a expiré et que vous essayez d'y accéder.

La session est invalidée comme suit. Après invalider est appelée, vous ne pouvez pas utiliser la session

session.invalidate(); 

La session expire lorsqu'elle expire. Après leur expiration, si vous essayez de l'utiliser, il va lancer la même exception.

Voici comment vous pouvez définir manuellement un délai d'expiration.

définissez votre délai d'attente dans le fichier web.xml. Ceci est défini en minutes.

<session-config> 
    <session-timeout>30</session-timeout> 
</session-config> 

Vous pouvez également le définir dans votre Java.

public void setMaxInactiveInterval(int interval) 

session.setMaxInactiveInterval(30*60); // This we set in seconds. 

nous précisons ici le temps, en secondes, entre les demandes du client avant que le conteneur de servlet annulera cette session. Une heure négative indique que la session ne devrait jamais être interrompue.

Assurez-vous que l'opération que vous effectuez ne dure pas plus longtemps que le délai imparti. Sinon, vous devrez réinitialiser la valeur.

EDIT:
Il est impossible de récupérer d'une manière propre. La session sera invalidée/inutilisable, et vous devrez créer une nouvelle session et repeupler les données. Généralement, les personnes sont redirigées vers un autre PAge d'erreur au lieu d'afficher le suivi de pile. "Votre session a expiré. Veuillez vous reconnecter."

Utilisez request.isRequestedSessionIdValid() pour identifier si l'ID de session est toujours valide.

HttpSession session =httpReg.getSession(false); 
if(!request.isRequestedSessionIdValid()) 
{ 
     //comes here when session is invalid. 
     // redirect to a clean error page "Your session has expired. Please login again." 
} 

Une autre option consiste à utiliser gérer la IllegalExceptionState à l'aide des captures d'essayer

HttpSession session =httpReg.getSession(false); 
try 
{ 
    if(session != null) 
    { 
     Date date = new Date(session.getLastAccessedTime()); 
    } 
} 
catch(IllegalStateException ex) 
{ 
     //comes here when session is invalid. 
     // redirect to a clean error page "Your session has expired. Please login again." 
} 

Side Note: Si vous avez un processus qui prend beaucoup de temps pour terminer et les sessions sont hors délai (ex : analyser des enregistrements de données vraiment volumineux). Vous devez envisager de les retirer de l'application Web et utiliser java simple pour les exécuter en tant que processus.

+0

Merci pour le commentaire .. mais je vérifie toujours le zéro avant d'utiliser la session. Et à partir du journal que je peux voir cette exception fait en ligne 3. – coder247

+0

@ coder247, S'il vous plaît pouvez-vous poster toute trace de la pile. –

+0

@ code247, cela peut être hors de propos, mais par curiosité, que se passe-t-il dans cette ligne? com.myapp.admin.CustomerContext.valueUnbound (CustomerContext.java:806) –

2

Votre exception indique que vous avez invalidé la session en appelant le .invalidate(), mais que vous essayez de l'utiliser. Ce n'est pas possible.

Chaque fois que vous invalidate() une session, ne l'utilisez pas plus.

Questions connexes