这一切都在文档中:
会话范围处于活动状态:
在任何 JSF 面孔或非面孔请求的所有标准生命周期阶段。
对话上下文提供对与特定对话关联的状态的访问。每个 JSF 请求都有一个关联的对话。该关联由容器根据以下规则自动管理:
任何 JSF 请求都只有一个关联的对话。
与 JSF 请求关联的对话在恢复视图阶段开始时确定,并且在请求期间不会更改。
任何对话都处于以下两种状态之一:瞬时或长期运行。
默认情况下,对话是短暂的
通过调用 Conversation.begin() 可以将短暂的对话标记为长时间运行
通过调用 Conversation.end() 可以将长时间运行的对话标记为瞬态
所有长时间运行的会话都有一个字符串值的唯一标识符,它可以在会话被标记为长时间运行时由应用程序设置,或者由容器生成。
如果与当前 JSF 请求关联的会话在 JSF 请求结束时处于瞬态,则该会话被销毁,会话上下文也被销毁。
如果与当前 JSF 请求相关联的会话在 JSF 请求结束时处于长时间运行状态,则它不会被销毁。相反,它可能会根据以下规则传播到其他请求:
与呈现 JSF 视图的请求相关联的长时间运行的对话上下文会自动传播到源自该呈现页面的任何面孔请求(JSF 表单提交)。
与导致 JSF 重定向(由导航规则或 JSF NavigationHandler 产生的重定向)的请求关联的长时间运行的对话上下文会自动传播到生成的非人脸请求,以及对同一 URL 的任何其他后续请求。这是通过使用名为 cid 的 GET 请求参数来完成的,该参数包含对话的唯一标识符。
与请求相关联的长时间运行的对话可以通过使用名为 cid 的 GET 请求参数传播到任何非人脸请求,该参数包含对话的唯一标识符。在这种情况下,应用程序必须管理这个请求参数。
当没有会话传播到 JSF 请求时,该请求与新的临时会话相关联。所有长时间运行的对话都被限定在一个特定的 HTTP servlet 会话中,并且可能不会跨越会话边界。在以下情况下,传播的长时间运行的对话无法恢复并与请求重新关联:
当 HTTP servlet 会话无效时,在 servlet service() 方法完成后,在当前会话期间创建的所有长时间运行的会话上下文都将被销毁。
允许容器任意销毁与当前没有 JSF 请求相关联的任何长时间运行的对话,以节省资源。
作者:
加文·金,皮特·缪尔