Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getSession(false)导致java.lang.IllegalStateException_Java_Tomcat_Servlets_Tomcat6 - Fatal编程技术网

getSession(false)导致java.lang.IllegalStateException

getSession(false)导致java.lang.IllegalStateException,java,tomcat,servlets,tomcat6,Java,Tomcat,Servlets,Tomcat6,当我试图从请求中获取会话时,如果会话过期,它会导致空指针异常。下面给出的是代码的一部分。我在第三行遇到异常 public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { HttpServletRequest httpReq = (HttpServletRequest) req; HttpSession session =

当我试图从请求中获取会话时,如果会话过期,它会导致空指针异常。下面给出的是代码的一部分。我在第三行遇到异常

public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) req;
HttpSession session = httpReq.getSession(false);
这是stacktrace:

java.lang.IllegalStateException: getLastAccessedTime: Session already invalidated
at org.apache.catalina.session.StandardSession.getLastAccessedTime(StandardSession.java:423)
at org.apache.catalina.session.StandardSessionFacade.getLastAccessedTime(StandardSessionFacade.java:84)
at com.myapp.admin.CustomerContext.valueUnbound(CustomerContext.java:806)
at org.apache.catalina.session.StandardSession.removeAttributeInternal(StandardSession.java:1686)
at org.apache.catalina.session.StandardSession.expire(StandardSession.java:801)
at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:576)
at org.apache.catalina.connector.Request.doGetSession(Request.java:2386)
at org.apache.catalina.connector.Request.getSession(Request.java:2120)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:833)
at com.myapp.ui.web.filter.ApplicationSessionFilter.doFilter(ApplicationSessionFilter.java:45)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.myapp.ui.web.filter.ErrorFilter.doFilter(ErrorFilter.java:42)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:662)

这不是空指针异常。
这是一个非法的州例外

当会话无效/过期,并且您试图访问它时,就会发生这种情况

会话无效,如下所示

session.invalidate();
调用invalidate后,您不能使用会话

会话超时时将过期。在它们过期之后,如果您尝试使用它,它将抛出相同的异常

以下是手动设置超时的方法

在web.xml中设置超时。这是以分钟为单位设置的

<session-config>
   <session-timeout>30</session-timeout> 
</session-config>
在这里,我们指定servlet容器使该会话无效之前,客户端请求之间的时间(以秒为单位)。负时间表示会话不应超时

确保正在执行的操作所用时间不超过超时时间。否则,您必须重置该值

编辑:
不可能以干净的方式从中恢复。会话将失效/不可用,您需要创建新会话并重新填充数据。 通常,人们会被重定向到另一个错误页面,而不是显示堆栈跟踪。“您的会话已过期。请重新登录。”

使用request.isRequestedSessionIdValid()标识会话ID是否仍然有效

HttpSession session =httpReg.getSession(false);
if( !request.isRequestedSessionIdValid() )
{
        //comes here when session is invalid.
        // redirect to a clean error page "Your session has expired. Please login again."
}
另一个选项是使用try-catch处理IllegaleExceptionState

HttpSession session =httpReg.getSession(false);
try
{
     if(session != null)
     { 
       Date date = new Date(session.getLastAccessedTime()); 
    }
}
catch( IllegalStateException ex )
{
      //comes here when session is invalid.
      // redirect to a clean error page "Your session has expired. Please login again."
}
旁注: 如果您确实有一个需要很长时间才能完成的进程,并且会话超时(例如:解析非常大的数据记录)。
您应该考虑将它们从Web应用程序中取出,并使用简单的java作为进程运行它们。

您的异常表明您已经通过调用<代码> .SimultIdAudio()>代码>无效,但正在尝试使用它。这是不可能的


每当您
invalidate()
会话时,不要再使用它

可能没有任何会话附加到he请求。因为如果您没有创建任何会话,getSession(fasle)将返回null。感谢您的评论。。但是我总是在使用会话之前检查空值。从日志中我可以看到第3行的异常原因。@code247,这可能不相关,但出于好奇,这一行发生了什么?com.myapp.admin.CustomerContext.valueUnbound(CustomerContext.java:806)@kensen如果(session!=null){date=new date(session.getLastAccessedTime());},则在806:)会发生这种情况。试图从会话中获取上次访问的时间。但在此之前有一个空检查。@coder247我编辑了我的答案。请检查一下。这不是空指针异常。这是一个IllegalStateException,因为会话无效。当我在会话超时后尝试访问页面时,我收到此异常。当前会话超时为30分钟。在这之前,没有问题,在30分钟的空闲时间后,会发生异常。
HttpSession session =httpReg.getSession(false);
try
{
     if(session != null)
     { 
       Date date = new Date(session.getLastAccessedTime()); 
    }
}
catch( IllegalStateException ex )
{
      //comes here when session is invalid.
      // redirect to a clean error page "Your session has expired. Please login again."
}