如何在会话对象上调用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是如何工作的?实例化、会话、共享变量和多线程解释了这一切发生的更大上下文。