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



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

我读到,如果客户端还没有用会话ID进行响应,isNew()将返回true。但这意味着什么?请解释

我读到如果客户端还没有响应会话ID,isNew()将返回true。但这意味着什么?

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

  • 在新会话场景中,服务器正在为用户/客户端创建一个新会话。(客户端可能在请求中没有提供会话id,或者它可能提供了服务器认为无效的会话id;如果不存在则创建";旗帜servlet基础结构意识到没有当前会话,创建一个具有新会话id的新会话,并将其保存在会话存储中。在请求完成时,会话id被返回给客户端;例如作为cookie或者作为附加了会话id的URL。

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

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

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

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

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

如果有帮助的话,servlet是如何工作的?实例化、会话、共享变量和多线程解释了这一切发生的更大上下文。

最新更新