<partial-response> XML 在 ajax 重定向到 WildFly 中的安全约束后显示为纯文本
<partial-response> XML shown as plain text after ajax redirect on security constraint in WildFly
我在 ajax 安全约束重定向时遇到了这个奇怪的问题:
当我的会话超时后在受角色保护的页面上进行 ajax 调用(通过单击可排序的 p:dataTable
列或触发 p:poll
时),一个<partial-response><redirect-url=...
来自 OmniFaces 的 XML 显示在屏幕上。
当我删除 OmniFaces 时,ajax 调用似乎无声地失败并且我没有显示 XML。
安全配置如下 web.xml:
<security-constraint>
<web-resource-collection>
<web-resource-name>Pages</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Resources</web-resource-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</web-resource-collection>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>myRealm</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/login.xhtml?error=true</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>user</role-name>
</security-role>
我转载了。这是WildFly本身的一个奇怪quirk/bug。
这里发生了什么?
默认情况下,在没有 OmniFaces 的情况下,当会话过期时在受限页面上触发请求时,服务器默认 returns 由 [=10= 标识的整个 HTML 页面] 作为响应,无论请求的来源如何。对于 JSF ajax 请求,这显然失败了,因为负责处理 ajax 请求的 JavaScript 无法处理整个 HTML 页面作为响应,它期望一个特殊的 XML 响应。用户没有任何形式的反馈。这是因为 OmniFaces 1.2 已在其 OmniPartialViewContext
中修复,由以下相关问题触发:ViewExpiredException not thrown on ajax request if JSF page is protected by j_security_check.
使用 OmniFaces,<partial-response><redirect url="originalURL">
形式的特殊 JSF ajax 重定向响应被 returned 而不是整个登录页面,安全约束再次被触发,但是这次使用真正的同步请求而不是 JSF ajax 请求。当服务器 return 是整个 <form-login-page>
时,这样就可以正常工作了。
WildFly(截至目前仅测试 10.0.0),但是,似乎缓存了会话中第一个安全约束命中的整个 <form-login-page>
响应(而预计它仅缓存关联的请求) 和 return 对受限请求的每次命中的准确响应。这就是为什么您每次都会看到初始 <partial-response>
XML 响应。
根据 this commit,在 OmniPartialViewContext
中生成 ajax 重定向之前,我通过再次显式使会话无效来绕过它。 OmniFaces 2.3 中提供了修复程序。
我在 ajax 安全约束重定向时遇到了这个奇怪的问题:
当我的会话超时后在受角色保护的页面上进行 ajax 调用(通过单击可排序的 p:dataTable
列或触发 p:poll
时),一个<partial-response><redirect-url=...
来自 OmniFaces 的 XML 显示在屏幕上。
当我删除 OmniFaces 时,ajax 调用似乎无声地失败并且我没有显示 XML。
安全配置如下 web.xml:
<security-constraint>
<web-resource-collection>
<web-resource-name>Pages</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Resources</web-resource-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</web-resource-collection>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>myRealm</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/login.xhtml?error=true</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>user</role-name>
</security-role>
我转载了。这是WildFly本身的一个奇怪quirk/bug。
这里发生了什么?
默认情况下,在没有 OmniFaces 的情况下,当会话过期时在受限页面上触发请求时,服务器默认 returns 由 [=10= 标识的整个 HTML 页面] 作为响应,无论请求的来源如何。对于 JSF ajax 请求,这显然失败了,因为负责处理 ajax 请求的 JavaScript 无法处理整个 HTML 页面作为响应,它期望一个特殊的 XML 响应。用户没有任何形式的反馈。这是因为 OmniFaces 1.2 已在其 OmniPartialViewContext
中修复,由以下相关问题触发:ViewExpiredException not thrown on ajax request if JSF page is protected by j_security_check.
使用 OmniFaces,<partial-response><redirect url="originalURL">
形式的特殊 JSF ajax 重定向响应被 returned 而不是整个登录页面,安全约束再次被触发,但是这次使用真正的同步请求而不是 JSF ajax 请求。当服务器 return 是整个 <form-login-page>
时,这样就可以正常工作了。
WildFly(截至目前仅测试 10.0.0),但是,似乎缓存了会话中第一个安全约束命中的整个 <form-login-page>
响应(而预计它仅缓存关联的请求) 和 return 对受限请求的每次命中的准确响应。这就是为什么您每次都会看到初始 <partial-response>
XML 响应。
根据 this commit,在 OmniPartialViewContext
中生成 ajax 重定向之前,我通过再次显式使会话无效来绕过它。 OmniFaces 2.3 中提供了修复程序。