isNew()如何判断会话是新会话还是已在使用?

时间:2012-02-27 11:21:44

标签: java session java-ee

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

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

1 个答案:

答案 0 :(得分:23)

  

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

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

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

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

在第一个场景中,在会话对象上调用isNew()将返回true,因为这是一个新会话。

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

  

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

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