java - 春java.lang.IllegalStateException : Cannot create a session after the response has been committed

标签 java spring session spring-mvc spring-security

我的 spring 应用程序中存在 session 管理问题,情况如下。 当用户打开我的应用程序 URL 时,它会要求提供凭据并登录。用户登录后,如果他打开一个新选项卡并粘贴我的应用程序 URL,它会再次要求提供凭据并用户登录。

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

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 可能会发送重定向到登录页面,而您的自定义过滤器会尝试创建 session (由于响应已经发送,因此无法完成)。

你应该修改你的过滤器,这样它就不会急切地自己创建 session :

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

关于java - 春java.lang.IllegalStateException : Cannot create a session after the response has been committed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26343666/

相关文章:

java - Android 无法通过密码验证

java - @requestparam spring 始终为 null

java - 如何使用NamedParameterJdbcTemplate进行批量插入

php - 在子域下工作的 session cookie

php - PHP 5.3 和 session 文件夹的问题

java - Rundeck 在多台服务器上运行命令的任何替代方案?

Java - 如何检测文本文件中的行数并进行计算

java - 如何捕获 new ClassPathXmlApplicationContext() 的 FileNotFoundException

api - 传统 Web 应用程序和 API 中的身份验证、授权和 session 管理

java - 将实例与 Java 中的 HashMap 进行比较时出现问题