我们在项目中使用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做的参数是什么?他们的目的是什么?
答案 0 :(得分:9)
它是规范issue 949所描述的新JSF 2.2功能的一部分。基本上,它使JSF能够识别客户端窗口。它与CDI cid
中的@ConversationScoped
和CODI windowId
/ @ViewScoped
中的@ViewAccessScoped
基本相同。此客户端窗口ID又由新的JSF 2.2 @FlowScoped
范围使用,如规范issue 730所述。
“JSF 2.2中有什么新东西?”我的同事Arjan Tijms的文章很明确地解释了这个问题:
生命周期
通过Window Id
识别客户端窗口可以说,自创建以来一直困扰Web应用程序开发的最大问题之一是无法区分源自单个浏览器的不同窗口的请求。实际的解决方案不仅应该早就应该实现,而且需要很长时间才能意识到这一点甚至是一个问题。
问题的根源一如既往地说,HTTP协议本质上是无状态的,而应用程序通常不是。虽然有cookie的概念,但绝大多数是用于区分来自不同用户的请求并实现会话范围之类的机制,其中大部分登录机制都基于此。
虽然cookie确实适用于此,但它是每个浏览器和域的全局。如果用户为同一个域打开多个选项卡或窗口,那么来自这些选项的请求将向服务器发送相同的cookie。因此,通常不可能在同一网站的不同窗口中以不同的用户身份登录,并且在不同的窗口中具有工作流程(包括回发,导航)也可能因此而烦恼。
在JSF中,有各种与此相关的解决方案。只要用户停留在同一页面上并且仅进行回发,视图范围就可以有效地实现每个窗口的会话。当通过Redirect / GET进行导航时,Flash用于在不同页面之间传输数据(可能在同一窗口内)。第三方实施的范围很广,可以做类似的事情。
所有这些都有一些隐含的概念或假设“客户端窗口”的概念,但没有明确的API。
JSF 2.2将引入对此的两个不同方面的支持:
- 识别单个窗口:客户端窗口标识
- API和生活方式对窗口概念的认识
显然你已经配置了你的应用程序。