java.lang.IllegalStateException-getAttribute-Session-already-invalidated-会话失效-异常解决
java.lang.IllegalStateException: getAttribute: Session already invalidated 会话失效 异常解决
项目中使用到了编辑视频的工具,其中就有一个功能为视频转码,需要转换的时间很长所以就会报错异常
java.lang.IllegalStateException: getAttribute: Session already invalidated
翻译过来就是会话无效
百度了一下基本会照成Session无效这样的情况有两种
(1)Session timeout;会话时间超时
(2)程序中调用了session.invalidate()方法。是将session设置为失效,一般在退出时使用
2022-10-13 09:23:20.716 -|-ERROR [rThread-8080-26] Servlet.service() for servlet [dispatcherServlet] in context with path [/umc] threw exception [Filtered request failed.] with root cause
java.lang.IllegalStateException: getAttribute: Session already invalidated
at com.bes.enterprise.webtier.session.DefaultSession.getAttribute(DefaultSession.java:1159)
at com.bes.enterprise.webtier.session.DefaultSessionFacade.getAttribute(DefaultSessionFacade.java:99)
at org.apache.shiro.web.session.HttpServletSession.getAttribute(HttpServletSession.java:146)
at org.apache.shiro.session.ProxiedSession.getAttribute(ProxiedSession.java:121)
at org.apache.shiro.subject.support.DelegatingSubject.getRunAsPrincipalsStack(DelegatingSubject.java:473)
at org.apache.shiro.subject.support.DelegatingSubject.getPrincipals(DelegatingSubject.java:157)
at org.apache.shiro.subject.support.DelegatingSubject.getPrincipal(DelegatingSubject.java:153)
at org.apache.shiro.web.servlet.ShiroHttpServletRequest.getSubjectPrincipal(ShiroHttpServletRequest.java:96)
at org.apache.shiro.web.servlet.ShiroHttpServletRequest.getUserPrincipal(ShiroHttpServletRequest.java:112)
at org.springframework.web.servlet.FrameworkServlet.getUsernameForRequest(FrameworkServlet.java:1160)
at org.springframework.web.servlet.FrameworkServlet.publishRequestHandledEvent(FrameworkServlet.java:1145)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1023)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:584)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:229)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.montnets.umc.portal.common.basic.business.filter.LoginFilter.doFilter(LoginFilter.java:147)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:191)
at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.bes.enterprise.webtier.core.DefaultWrapperValve.invoke(DefaultWrapperValve.java:193)
at com.bes.enterprise.webtier.core.DefaultContextValve.invoke(DefaultContextValve.java:92)
at com.bes.enterprise.webtier.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
at com.bes.enterprise.webtier.core.DefaultHostValve.invoke(DefaultHostValve.java:136)
at com.bes.enterprise.webtier.valves.ErrorReportValve.invoke(ErrorReportValve.java:77)
at com.bes.enterprise.webtier.core.DefaultEngineValve.invoke(DefaultEngineValve.java:83)
at com.bes.enterprise.webtier.connector.CoyoteAdapter.service(CoyoteAdapter.java:367)
at com.bes.enterprise.web.crane.http11.Http11Processor.service(Http11Processor.java:631)
at com.bes.enterprise.web.crane.AbstractProcessorLight.process(AbstractProcessorLight.java:61)
at com.bes.enterprise.web.crane.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802)
at com.bes.enterprise.web.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1784)
at com.bes.enterprise.web.util.net.SocketProcessorBase.run(SocketProcessorBase.java:45)
at com.bes.enterprise.web.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1145)
at com.bes.enterprise.web.util.net.Nio2Endpoint$Nio2SocketWrapper$2.completed(Nio2Endpoint.java:719)
at com.bes.enterprise.web.util.net.Nio2Endpoint$Nio2SocketWrapper$2.completed(Nio2Endpoint.java:697)
at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
at sun.nio.ch.Invoker$2.run(Invoker.java:218)
at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at com.bes.enterprise.web.util.threads.WorkThread$WrappingRunnable.run(WorkThread.java:57)
at java.lang.Thread.run(Thread.java:855)
通过日志排查了一下 确实是会话时间超时导致的
前端请求后台方法时开始时间 2022-10-13 09:21:17.957
视频处理成功后的时间 2022-10-13 09:23:20.714
时间花费了将近2分钟,但是前端请求设置的会话时间才60秒 =1分钟 所以当后台处理完视频后在去获取请求时生成的Session 就会报错,无法找不到Session。
解决方案及效果
针对超时时间的设置,有两种方法可以解决这个问题,
(1) 在Servlet代码中,使用HttpSession对象的方法setMaxInactiveInterVal(int)设置一个会话维持非活动状态的最大秒数。代码如下:
public void doGet( HttpServletRequest req ,HttpServletResponse res) throws
ServletException,IOException {
HttpSession session=req.getSession();
session.setMaxInactiveInterval(60);
}
(2).在web.xml文件内通过使用session-config标志设置,通过标志session-timeout可以定义所有非活动HttpSession对象存在的最大时间。