有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果Java会话有对象引用,它会过期吗?

假设我有一个Java web应用程序,我将会话超时设置为10分钟。我的servlet上下文中还有一个Collection<HttpSession>,它存储了所有当前存在的会话(忽略这个集合的无用性)。使用这种设置,会话对象是否真的会过期?集合将贯穿应用程序的整个生命周期,包含对每个会话的引用

  1. 如果某个会话确实过期,那么如果我稍后尝试访问该会话会发生什么?我是否得到(n)(空指针)异常?或者,会话已经被回收,因此我没有访问我认为是的会话
  2. 如果会话不能再过期,我可以做什么来补救
  3. 对于每个不同的servlet containerv(tomcat、jboss、jetty……),这种行为是否有所不同或者它或多或少是一致的

共 (1) 个答案

  1. # 1 楼答案

    现在还不清楚,作为一名web开发人员,当web容器执行类似(或更多)操作时,为什么要在集合中维护会话。由于您通常通过HttpServletRequest对象从容器中请求会话,即使您维护了对它的另一个引用(以便可能防止它进行垃圾收集),web容器也不知道它,因此会话将过期(最直接的意思是)

    If a session DOES expire, then what happens if I try to access the session at a later time?

    像Tomcat这样的web容器为请求维护一个会话。考虑到Cookie正在管理会话,每个请求都会将相同的Cookie发送到相同的服务器,因此web容器会安排查找会话并从请求对象返回给您。见getSession() API。在这里,根据参数的值,您可以从web容器请求新的或现有的会话

    Do I get a(n) (null pointer) Exception?

    也许吧。请参阅上面的API(布尔参数getSession被重载)

    Or could the session already be recycled and thus I'm not accessing the session I think I was?

    是的,这是完全可能的。如果会话过期(例如,在一些不活动之后),因为您要求web容器使其过期,所以您已经丢失了它(可以这么说)

    If a session CAN NO LONGER EXPIRE, what can I do to remedy this?

    这很奇怪,但是基于web容器实现可能是可行的。所有web容器(应该)都提供一个配置,帮助配置默认会话超时(我认为servlet spec提供了默认值)。在会话超时时不过期是相当不安全的。查看web容器的文档,了解如何配置它。应该有办法限制会话的有效性

    Does this behaviour differ for each different servlet container env(tomcat, jboss, jetty...) or is it more or less consistent?

    会话和会话超时的概念在容器中是相同的,因为它与HTTP有关,并且是servlet规范的一部分。每个容器都有文档来配置其默认会话超时