我尝试了 JavaServer Faces 2.2 (Mojarra 2.2.4) 的最新版本,并注意到以这种不需要的方式更改了我的查询字符串:
page.jsf?jftfdi=&jffi=
代替
page.jsf
我发现它是新的 JSF 2.2 特性。但是这些查询参数(jftfdi,jffi)破坏了我对 SEO 友好的 url。我怎样才能禁用它?
我尝试了 JavaServer Faces 2.2 (Mojarra 2.2.4) 的最新版本,并注意到以这种不需要的方式更改了我的查询字符串:
page.jsf?jftfdi=&jffi=
代替
page.jsf
我发现它是新的 JSF 2.2 特性。但是这些查询参数(jftfdi,jffi)破坏了我对 SEO 友好的 url。我怎样才能禁用它?
这是 Mojarra 中的一个错误。当没有任何流导航配置(通过新的@FlowScoped
注释和<j:flow-xxx>
标签)时,它们不应该被附加。
基本上,OutcomeTargetRenderer
负责 HTML 输出生成的类<h:link>
在附加流导航参数之前<h:button>
错误地检查是否NavigationCase#getToFlowDocumentId()
返回非。null
但是,基于javadoc,基本实现永远不会返回null
,而是一个空字符串。因此,渲染器始终认为它处于流导航的中间,并始终附加关联jftfdi
和jffi
请求参数。修复方法是让它检查它是否返回一个非空字符串。
我将其报告为问题 3054,他们确认这是一个错误,目前正在解决此问题。Mojarra 2.2.5 中可能会提供该修复程序。
更新:截至目前,不到一天后,它已修复为 2.2.5。
顺便说一下,它jftfdi
代表“ To Flow Document ID”,它在javadocjavax.faces
中指定如下:
由 component-family 的 Renderer 渲染的组件
javax.faces.OutcomeTarget
必须使用此常量作为参数名称,该参数表示该组件将导致输入的流的定义文档 ID。
并且jffi
代表“流 ID”,它在javadocjavax.faces
中指定如下:
由 component-family 的 Renderer 渲染的组件
javax.faces.OutcomeTarget
必须使用此常量作为参数名称,该参数表示该组件将导致输入的流的流 id。
我之前也有同样的错误。这个bug的根源是jsf的版本。只需尝试像这样将版本升级到 2.2.5:
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.5</version>
</dependency>
希望它有帮助