web-dev-qa-db-ja.com

Spring Java.lang.IllegalStateException:応答がコミットされた後はセッションを作成できません

私の春のアプリケーションでセッション管理の問題があります。これがシナリオです。ユーザーがアプリのURLを開くと、資格情報を求めてログインします。ユーザーが侵入して新しいタブを開いてアプリのURLを貼り付けると、資格情報を再度求めてユーザーがログインします。

ユーザーがtab1でログアウトし、ユーザーが2番目のタブで何らかの操作を実行したい場合、ユーザーは以下のスタックトレースでエラーを受け取り、ログアウトします。

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();
    }
}

ユーザーが別のタブでログアウトしているときに、ユーザーが1つのタブで操作を実行できるようにするにはどうすればよいですか?誰かが私の問題を助けてくれますか?

8
RanPaul

カスタムフィルターがセッションを作成しようとする一方で、Springはおそらくログインページにリダイレクトを送信します(応答が既に送信されているため実行できません)。

独自にセッションを作成しないように、フィルターを変更する必要があります。

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

Rd.forward()またはrd.include()を使用したかどうかを確認します。このエラーを解決するには、rd.include()を使用する必要があります。一度試してみてください。

0
Sandeep Reddy