【发布时间】:2014-12-08 05:38:24
【问题描述】:
我的 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();
}
}
当用户在另一个选项卡中注销时,如何确保用户应该能够在一个选项卡中执行操作?谁能帮我解决我的问题?
【问题讨论】:
-
好吧,“修复你的代码”将是一个有效的答案。不知道
FlashRecyclingFilter在做什么,但错误就在那里。 Spring 的 Security 可能发送了一个重定向到登录页面,并且您的过滤器试图在会话中存储一些不存在的内容。检查HttpServletRequest#getSession(boolean)。 -
@PavelHoral 我用
FlashRecyclingFilter更新了这个问题,它只是想从request获取session -
在没有会话时将过滤器设置为无操作。 IE。使用
getSession(false),如果为空则跳过代码。 -
发表了我的评论作为实际答案。
标签: java spring session spring-mvc spring-security