Spring java.lang.IllegalStateException: Ne peut pas créer une session après la réponse a été commis
Je vais avoir une session de gestion de la question de mon ressort de l'application, voici le scénario.
Lorsqu'un utilisateur ouvre mon appli URL il va demander des informations d'identification et les journaux. Après que l'utilisateur looged en et si il ouvre un nouvel onglet et de le coller mon app URL il va demander à nouveau les informations d'identification et de connexion de l'utilisateur.
Maintenant, si l'utilisateur se déconnecte dans tab1 et si l'utilisateur veut effectue toute opération dans le deuxième onglet, l'utilisateur reçoit une erreur avec ci-dessous stacktrace et se déconnecte.
Oct 10, 2014 3:11:27 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [CollPortal] in context with path [/CollPortal] threw exception
java.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2886)
at org.apache.catalina.connector.Request.getSession(Request.java:2316)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:898)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:910)
at com.dc.core.common.FlashRecyclingFilter.doFilterInternal(FlashRecyclingFilter.java:22)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.dc.core.common.StripJSessionIdFilter.doFilter(StripJSessionIdFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Voici mon FlashRecyclingFilter
@Component
public class FlashRecyclingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
super.doFilter(request, response, filterChain);
IFlash flash = new Flash(request.getSession());
flash.recycle();
}
}
Comment puis-je m'assurer que l'utilisateur devrait être capable d'effectuer des opérations dans un onglet lorsque l'utilisateur est connecté à un autre onglet? Quelqu'un peut-il m'aider avec mon problème?
FlashRecyclingFilter
est en train de faire, mais l'erreur est là. Printemps de Sécurité probablement envoyé une redirection vers la page de login et de votre filtre est d'essayer de stocker quelque chose sur la session, ce qui n'existe pas. Vérifier HttpServletRequest#getSession(boolean).J'ai mis à jour la question avec
FlashRecyclingFilter
Sa juste essayer d'obtenir session
de request
Rendre le filtre no-op quand il n'y a pas de session. I. e. utilisation
getSession(false)
et passer le code si vous obtenez la valeur null.Posté mon commentaire comme une réponse réelle.
OriginalL'auteur RanPaul | 2014-10-13
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe est que le Printemps est probablement envoie rediriger vers la page de connexion, si votre filtre personnalisé essaie de créer une session (qui ne peut être fait que la réponse a déjà été envoyé).
Vous devez modifier votre filtre de sorte qu'il n'est pas ardemment créer de la session sur son propre:
Ce sont des OP composants autant que je sache.
OriginalL'auteur Pavel Horal
De vérifier si vous avez utilisé la rd.forward() ou rd.include(). nous devons utiliser la rd.include() pour résoudre cette erreur. essayez avec cette fois.
rd
?OriginalL'auteur Sandeep Reddy