我们在项目中使用 JavaServer Faces 2.2 (Mojarra 2.2.1)。我注意到了一些奇怪的事情。在reporting.xhtml
我使用f:metadata
新f:viewAction
浏览器(在本例中为 Safari)的页面上,显示以下查询字符串:
reporting.jsf?jftfdi=&jffi=reporting%3Ffaces-redirect%3Dtrue
这是什么法宝?参数 jftfdi 和 jiffi 是做什么的?他们的目的是什么?
它是规范问题 949中描述的新 JSF 2.2 功能的一部分。基本上,它使 JSF 能够识别客户端窗口。cid
它与CDI@ConversationScoped
和windowId
CODI 中的@ViewScoped
/基本相同@ViewAccessScoped
。@FlowScoped
如规范问题 730所述,此客户端窗口 ID 又被新的 JSF 2.2范围使用。
“JSF 2.2 中有什么新功能?” 我的同事 Arjan Tijms 的文章非常清楚地解释了这种需求:
生命周期
通过窗口 ID 识别客户端窗口
可以说,自 Web 应用程序开发以来一直困扰其的最大问题之一是无法区分来自单个浏览器的不同窗口的请求。不仅早就应该找到实际的解决方案,而且需要很长时间才能意识到这甚至是一个问题。
与往常一样,问题的根源在于 HTTP 协议本质上是无状态的,而应用程序通常不是。虽然有 cookie 的概念,但它主要是用于区分来自不同用户的请求并实现诸如会话范围之类的东西的机制,而大部分登录机制又基于会话范围。
虽然 cookie 确实适用于此,但它对每个浏览器和域都是全局的。如果用户为同一个域打开多个选项卡或窗口,则来自这些的请求都会将相同的 cookie 发送到服务器。因此,在同一网站的不同窗口中以不同用户身份登录通常是不可能的,因此在不同窗口中拥有工作流程(包括回发、导航)也可能很麻烦。
在 JSF 中有各种与此相关的解决方案。只要用户停留在同一页面上并且只进行回发,视图范围就有效地实现了每个窗口的会话。当通过 Redirect/GET 完成导航时,Flash 用于在不同页面之间(可能在同一窗口内)传输数据。第三方实现了各种各样的范围,它们做类似的事情。
所有这些都对“客户端窗口”的概念有一些隐含的概念或假设,但没有明确的 API。
JSF 2.2 将引入对这两个不同方面的支持:
- 单个窗口的标识:客户端窗口 ID
- 窗口概念的 API 和生命周期意识
显然你已经这样配置了你的应用程序。