【问题标题】:HttpServletRequest.getSession(false): When does it return null?HttpServletRequest.getSession(false):什么时候返回null?
【发布时间】:2012-06-03 10:42:12
【问题描述】:

我想知道在调用 HttpServletRequest.getSession(false) 时何时会收到“null”

另外:有没有关于 HttpSession 的好教程?我想获得以下详细信息:何时使无效()?后果是什么?我是否需要检查返回的 HttpSession 是否有效? ...

【问题讨论】:

  • 当我意识到某些搜索引擎不支持我的 robots.txt 时,我确实为我的网站这样做了。简而言之,您使用 false 作为参数调用 getSession(boolean)。如果有会话,则返回会话;如果没有,则返回 null。然后在会话上调用 .getAttributeNames(),在无效会话(超时、关闭)上会引发 IllegalStateException。

标签: java jakarta-ee


【解决方案1】:

您实际上不应该期望空值。正如文档所说,如果请求没有活动会话(通常,您会在请求的过滤器链中检查它),则会创建一个会话。如果您从中得到一个空值,我敢打赌底层操作系统存在问题:会想到没有足够的内存来生成会话。

【讨论】:

  • 这是让我提出这个问题的示例:stackoverflow.com/questions/3080203/…。我想知道是否还有更多这样的案例。其他人是否同意对会话进行过滤检查是个好主意?
  • 正如发帖者所说,他尝试了 getSession(true),根据我的经验和文档将创建会话,如果它不存在的话。如果没有创建它,我敢打赌这是有限资源的问题或其他一些问题(正如一位海报所建议的,可能是反网络钓鱼技术),但我对上述应用程序服务器中的任何内容都不熟悉( Tomcat)。
  • 好的,所以在正常情况下(您的应用程序正在运行有足够的资源,...),您不应该为空。足够好(我将把它打开一天,以便其他人可以在需要时发表评论)。
  • 是的,这改变了答案。例如,在过滤器链中,如果此请求来自之前调用过该网站并具有接受会话(通过 cookie 或 jsessionid)的能力并将信息重新提供回应用程序服务器的客户端,则存在session 已经为请求打开,并且调用应该返回 session 对象。但是,如果这是第一次请求,或者调用者没有返回必要的信息来确定这是后续请求,则调用返回 null。
  • 这很可能。经过一段时间的空闲时间(没有新请求),会话无论如何都会失效(这通常是在空闲时间发生后的配置问题)。会话可以过早失效的另一种方法是手动调用 session.invalidate()。由于操作(想想入侵检测/预防系统),可能有多种方法可以自动使会话无效,您可以检查应用程序服务器的安装。甚至某些缓存机制也会使会话无效,以在某些超时后强制重新缓存内容。
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多