如果存在对Java会话的对象引用,它会过期吗?
假设我有一个Java web应用程序,我将会话超时设置为10分钟。在我的servlet上下文中,我还有一个如果存在对Java会话的对象引用,它会过期吗?,java,session,servlets,Java,Session,Servlets,假设我有一个Java web应用程序,我将会话超时设置为10分钟。在我的servlet上下文中,我还有一个集合,它存储所有当前存在的会话(忽略此集合的无效性)。使用此设置,会话对象是否真的会过期?该集合将贯穿整个应用程序的生命周期,保存对每个会话的引用 如果某个会话确实过期,那么如果我稍后尝试访问该会话会发生什么情况?我是否得到(n)(空指针)异常?或者会话已经被回收,因此我没有访问我认为我是的会话 如果会话不能再过期,我可以做什么来补救 对于每个不同的servlet containerv(to
集合
,它存储所有当前存在的会话(忽略此集合的无效性)。使用此设置,会话对象是否真的会过期?该集合将贯穿整个应用程序的生命周期,保存对每个会话的引用
不清楚为什么作为一名web开发人员,当web容器执行类似(或更多)操作时,您要在集合中维护会话。由于您通常通过
HttpServletRequest
对象从容器请求会话,因此即使您维护了对它的另一个引用(以便可能防止它进行垃圾收集),web容器也不知道它,因此会话将过期(最直接的意思是)
如果某个会话确实过期,那么如果我稍后尝试访问该会话会发生什么情况
web容器(如Tomcat)为请求维护会话。考虑到Cookie正在管理会话,每个请求都会将相同的Cookie发送到相同的服务器,因此web容器会安排查找会话并从请求对象返回给您。看见在这里,根据参数的值,您可以从web容器请求新的或现有的会话
我是否得到(n)(空指针)异常
也许吧。请参阅上面的API(布尔参数,getSession
重载)
或者会话已经被回收,因此我没有访问我认为我是的会话
是的,这是完全可能的。如果会话过期(例如,在一些不活动之后),因为您要求web容器使其过期,所以您已经丢失了它(可以这么说)
如果会话不能再过期,我可以做什么来补救
这很奇怪,但是基于web容器实现是可能的。所有web容器(应该)都提供一个配置来帮助配置默认会话超时(我认为servlet规范提供了默认值)。在会话超时时不过期是相当不安全的。查看web容器的文档以了解如何配置此容器。应该有一种方法来限制会话的有效性
对于每个不同的servlet容器env(tomcat、jboss、jetty…),这种行为是否有所不同,或者或多或少是一致的
会话和会话超时的概念在容器中是相同的,因为它与HTTP有关,并且是servlet规范的一部分。每个容器都有文档来配置其默认会话超时。会话会过期吗?对当页面10分钟未被访问时。服务器必须始终具有对有效会话实例的引用,因此在您的示例中,每个会话实例至少有两个引用。请澄清,谢谢。至于为什么。。。其实这是一张地图。这样,我的应用程序可以始终知道哪些会话链接到每个用户。登录时,任何用户名都有允许的最大会话数(通常设置为1)。此外,用户名可以做某些事情,这些事情会在其所有会话中产生影响(如果数量>1),我需要轻松访问该用户名的其他会话。通过使用侦听器和sessionbinding Interface.Cool,可以轻松维护会话的集合。虽然你对会话的使用是创造性的,但它可能无法扩展。如果明天您想跟踪每个会话中的登录和注销时间,该怎么办?目前,数据库中保留了此类瞬态属性(例如,用于分析)。维护大型会话对象,特别是当它们过期时,可能不需要这样做。实际上,我确实希望会话过期,当它们过期时,其中的用户对象将被解除绑定,这反过来将通过使用httpsessionbindinglistener以编程方式从servlet上下文中的映射中删除会话。这就是这个问题的关键所在,我担心旧的过时会话可能会永远卡在我的地图上(或者更糟的是,会被回收为另一个用户名)!但既然不是这样,一切都应该顺利进行。我在数据库中已经有一个跟踪last和penultimatelogin datetime的用户表,但这似乎与这个问题无关。