如何在会话对象上调用isNew()
,检查会话是新会话还是已在使用?
我读到isNew()
如果客户端尚未使用会话ID回复,则返回true。但是这是什么意思 ?请解释
答案 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基础结构根据其获取会话对象的方式进行初始化。