如果Java会话有对象引用,它会过期吗?
假设我有一个Java web应用程序,我将会话超时设置为10分钟。我的servlet上下文中还有一个Collection<HttpSession>
,它存储了所有当前存在的会话(忽略这个集合的无用性)。使用这种设置,会话对象是否真的会过期?集合将贯穿应用程序的整个生命周期,包含对每个会话的引用
- 如果某个会话确实过期,那么如果我稍后尝试访问该会话会发生什么?我是否得到(n)(空指针)异常?或者,会话已经被回收,因此我没有访问我认为是的会话李>
- 如果会话不能再过期,我可以做什么来补救李>
- 对于每个不同的servlet containerv(tomcat、jboss、jetty……),这种行为是否有所不同或者它或多或少是一致的李>
# 1 楼答案
现在还不清楚,作为一名web开发人员,当web容器执行类似(或更多)操作时,为什么要在集合中维护会话。由于您通常通过
HttpServletRequest
对象从容器中请求会话,即使您维护了对它的另一个引用(以便可能防止它进行垃圾收集),web容器也不知道它,因此会话将过期(最直接的意思是)像Tomcat这样的web容器为请求维护一个会话。考虑到Cookie正在管理会话,每个请求都会将相同的Cookie发送到相同的服务器,因此web容器会安排查找会话并从请求对象返回给您。见getSession() API。在这里,根据参数的值,您可以从web容器请求新的或现有的会话
也许吧。请参阅上面的API(布尔参数
getSession
被重载)是的,这是完全可能的。如果会话过期(例如,在一些不活动之后),因为您要求web容器使其过期,所以您已经丢失了它(可以这么说)
这很奇怪,但是基于web容器实现可能是可行的。所有web容器(应该)都提供一个配置,帮助配置默认会话超时(我认为servlet spec提供了默认值)。在会话超时时不过期是相当不安全的。查看web容器的文档,了解如何配置它。应该有办法限制会话的有效性
会话和会话超时的概念在容器中是相同的,因为它与HTTP有关,并且是servlet规范的一部分。每个容器都有文档来配置其默认会话超时