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

时间:2016-03-07 10:29:46

标签: jsf wildfly omnifaces security-constraint partial-response

我对安全约束的ajax重定向有这个奇怪的问题:

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

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

1 个答案:

答案 0 :(得分:5)

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

这里发生了什么?

默认情况下,如果没有OmniFaces,当会话过期时在受约束的页面上触发请求时,服务器默认返回由<form-login-page>标识为响应的整个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重定向响应而不是整个登录页面,并再次触发安全约束,但这次是使用真正的同步请求而不是JSF ajax请求。当服务器返回整个<form-login-page>时,它会以这种方式工作。

然而,

WildFly(目前仅测试10.0.0)似乎缓存了会话中第一个安全约束命中的<form-login-page>响应(而预期只缓存关联的请求)和在受限请求的每次命中时都返回该响应。这就是为什么每次都看到最初的<partial-response> XML响应。

根据this commit,我在OmniPartialViewContext生成ajax重定向之前,再次显式地使会话失效,绕过了它。该修复程序可在OmniFaces 2.3中使用。