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

Spring java.lang.IllegalStateException:在提交响应后无法创建会话,java,spring,session,spring-mvc,spring-security,Java,Spring,Session,Spring Mvc,Spring Security,我的spring应用程序中有一个会话管理问题,下面是一个场景。 当用户打开我的应用程序URL时,它将要求提供凭据并登录。用户登录后,如果他打开一个新选项卡并粘贴我的应用程序URL,它将再次请求凭据,用户将登录 现在,如果用户在tab1中注销,并且如果用户希望在第二个tab中执行任何操作,则用户将收到一个错误,并在stacktrace下面注销 Oct 10, 2014 3:11:27 PM org.apache.catalina.core.StandardWrapperValve invoke S

我的spring应用程序中有一个会话管理问题,下面是一个场景。 当用户打开我的应用程序URL时,它将要求提供凭据并登录。用户登录后,如果他打开一个新选项卡并粘贴我的应用程序URL,它将再次请求凭据,用户将登录

现在,如果用户在tab1中注销,并且如果用户希望在第二个tab中执行任何操作,则用户将收到一个错误,并在stacktrace下面注销

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可能会将重定向发送到登录页面,而您的自定义筛选器会尝试创建会话(这无法完成,因为响应已经发送)

您应该修改过滤器,使其不会急于自行创建会话:

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()来解决该错误。试一下。

好的,“修复你的代码”将是一个有效的答案。不知道FlashRecyclingFilter正在做什么,但错误就在那里。Spring的安全性可能向登录页面发送了重定向,而您的筛选器正试图在会话中存储一些不存在的内容。检查。@Pavelholl我用
FlashRecyclingFilter
更新了这个问题,它只是试图从
request
获取
session
,当没有会话时,将筛选器设为无操作。例如,使用
getSession(false)
并在得到空值时跳过代码。将我的评论作为实际答案发布。嗨,帕维尔,我也遇到过同样的问题。你能告诉我怎样才能得到IFlash,Flash类(属于哪个API)吗?。谢谢。这些是OP的组件。有人能告诉我们IFlash的API是什么吗?因为我已经找了很久了time@Shessuky我猜这是OP可能创建的一些自定义类/接口,在这个问题上有点不相关。
rd
?它代表RequestDispatcher,我们用来将数据从servlet发送到jsp或html文件或类似的东西