【问题标题】:How does isNew() tell if the session is a new one or is already in use?isNew() 如何判断会话是新会话还是已在使用?
【发布时间】:2016-06-30 06:34:33
【问题描述】:

如何在会话对象上调用isNew(),检查会话是新的还是已经在使用?

我读到isNew() 如果客户端尚未响应会话 ID,则返回 true。但是这是什么意思 ?请解释

【问题讨论】:

标签: java session jakarta-ee


【解决方案1】:

我读到如果客户端尚未响应会话 ID,isNew() 将返回 true。但这是什么意思?

考虑服务器当前正在处理一个请求。会话处理有两种情况。

  • 在新会话场景中,服务器正在为用户/客户端创建一个新会话。 (客户端可能在请求中没有提供会话 id,或者它可能提供了服务器认为无效的会话 id。)servlet 的应用程序代码决定需要一个会话(例如,因为它有一些它想要的信息存储在那里),并尝试使用“如果不存在则创建”标志来获取它。 servlet 基础结构意识到没有当前会话,创建一个具有新会话 ID 的新会话,并将其保存在会话存储中。请求完成后,将 session id 返回给客户端;例如作为 cookie,或作为附加会话 ID 的 URL。

  • 在现有的会话场景中,客户端已经在请求中包含了会话id;例如作为会话 cookie,或作为请求 URL 中的会话 ID。 servlet 基础结构识别此 id,在其会话存储中查找它,并(如有必要)重新创建包含从会话存储中检索到的会话状态的 HttpSession 对象。当 servlet 的应用程序代码尝试访问会话时,它会得到这个 HttpSession 对象,而不是一个新对象。然后 servlet 在处理请求时可以使用和更新会话状态。

在第一种情况下,在会话对象上调用isNew() 将返回true,因为这是一个新会话。

在第二种情况下,对会话对象调用isNew() 将返回false,因为这不是一个新会话。

如何在 session 对象上调用 isNew(),检查 session 是新的还是已经在使用?

servlet 基础结构知道发生了两种情况中的哪一种,因为它进行了会话创建或会话查找。 isNew() 最明显的实现是在HttpSession 对象中包含一个private boolean 字段,并将该字段的值作为isNew() 的结果返回。该字段将由 servlet 基础结构根据其获取会话对象的方式进行初始化。

【讨论】:

  • 我没有理解您答案的一部分。能否请您把要点说得更清楚。
  • 我完全理解你回答的每一部分,谢谢你写下来。
猜你喜欢
  • 2012-08-23
  • 2011-10-22
  • 1970-01-01
  • 2011-02-23
  • 2021-08-09
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多