Spring java.lang.IllegalStateException:在提交响应后无法创建会话

我在我的spring应用程序中遇到会话管理问题,这是方案。 当用户打开我的应用程序URL时,它会要求提供凭据并登录。用户进入后,如果他打开一个新选项卡并粘贴我的应用程序URL,它将再次请求凭据并且用户登录。

现在,如果用户在tab1中注销,并且如果用户想要在第二个选项卡中执行任何操作,则用户会在下面的堆栈跟踪中收到错误并注销。

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) 

这是我的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(); } } 

当用户在另一个选项卡中注销时,如何确保用户能够在一个选项卡中执行操作? 有人可以帮我解决我的问题吗?

会发生什么是Spring可能会将重定向发送到登录页面,而您的自定义filter会尝试创建会话(由于响应已经发送,因此无法完成)。

您应该修改filter,以便它不会急切地创建会话:

 super.doFilter(request, response, filterChain); HttpSession session = request.getSession(false); if (session != null) { IFlash flash = new Flash(session); flash.recycle(); } 

检查您是否使用过rd.forward()或rd.include()。 我们必须使用rd.include()来解决该错误。 尝试一次。