5

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

当我的会话超时后在角色安全页面上进行 ajax 调用(通过单击可排序p:dataTable列或触发时)时,屏幕上会显示来自 OmniFaces 的 XML。p:poll<partial-response><redirect-url=...

当我删除 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>
4

1 回答 1

5

我复制了它。这是 WildFly 本身的一个奇怪的怪癖/错误。

这里发生了什么事?

默认情况下,如果没有 OmniFaces,当会话过期时在受限页面上触发请求时,服务器默认返回整个 HTML 页面<form-login-page>作为响应,而不管请求的来源。对于 JSF ajax 请求,这显然会失败,因为负责处理 ajax 请求的 JavaScript 无法将整个 HTML 页面作为响应来处理,因为它需要特殊的 XML 响应。用户没有任何形式的反馈。这是因为 OmniFaces 1.2 修复了它OmniPartialViewContext,由这个相关问题触发:ViewExpiredException not throw on ajax request if JSF page is protected by j_security_check

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

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

根据这个提交,我通过在生成 ajax 重定向之前再次显式地使会话无效来绕过它OmniPartialViewContext。OmniFaces 2.3 中提供了该修复程序。

于 2016-03-07T12:31:25.753 回答