<partial-response> 在 WildFly 中的安全约束下,ajax 重定向后显示为纯文本的 XML



我在安全约束下遇到ajax重定向时遇到了一个奇怪的问题:

在我的会话超时后,当在角色保护页面上进行 ajax 调用(通过单击可排序的p:dataTable列或触发p:poll时)时,屏幕上会显示来自 OmniFaces 的<partial-response><redirect-url=... 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本身的一个奇怪的怪癖/错误。

这是怎么回事?

默认情况下,如果没有 OmniFaces,当会话过期时在受约束的页面上触发请求时,服务器默认返回由<form-login-page>标识的整个 HTML 页面作为响应,而不考虑请求的来源。这显然在JSF ajax请求中失败,因为负责处理ajax请求的JavaScript无法处理整个HTML页面作为响应,因为它需要特殊的XML响应。用户没有任何形式的反馈。这是因为 OmniFaces 1.2 在其OmniPartialViewContext中修复,由以下相关问题触发:如果 JSF 页面受 j_security_check 保护,则 ajax 请求不会抛出 ViewExpireException。

使用

OmniFaces,以 <partial-response><redirect url="originalURL"> 的形式返回特殊的 JSF ajax 重定向响应,而不是整个登录页面,并且再次触发安全约束,但这次使用真正的同步请求而不是 JSF ajax 请求。当服务器返回整个<form-login-page>时,它会以这种方式正常工作。

然而,WildFly(截至目前仅测试了 10.0.0)似乎缓存了会话中第一个安全约束命中的整个<form-login-page>响应(而它预计仅缓存关联的请求),并在每次命中约束请求时准确返回该响应。这就是您每次都看到初始 <partial-response> XML 响应的原因。

根据此提交,我已经绕过了它,在OmniPartialViewContext中生成ajax重定向之前再次显式使会话无效。此修复在 OmniFaces 2.3 中可用。

相关内容

  • 没有找到相关文章

最新更新