Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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
如果存在对Java会话的对象引用,它会过期吗?_Java_Session_Servlets - Fatal编程技术网

如果存在对Java会话的对象引用,它会过期吗?

如果存在对Java会话的对象引用,它会过期吗?,java,session,servlets,Java,Session,Servlets,假设我有一个Java web应用程序,我将会话超时设置为10分钟。在我的servlet上下文中,我还有一个集合,它存储所有当前存在的会话(忽略此集合的无效性)。使用此设置,会话对象是否真的会过期?该集合将贯穿整个应用程序的生命周期,保存对每个会话的引用 如果某个会话确实过期,那么如果我稍后尝试访问该会话会发生什么情况?我是否得到(n)(空指针)异常?或者会话已经被回收,因此我没有访问我认为我是的会话 如果会话不能再过期,我可以做什么来补救 对于每个不同的servlet containerv(to

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

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

  • 不清楚为什么作为一名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的用户表,但这似乎与这个问题无关。