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

标签 jsf wildfly omnifaces security-constraint partial-response

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

当 session 超时后,在角色安全页面上进行 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 本身的一个奇怪的怪癖/错误。

这里发生了什么?

默认情况下,如果没有 OmniFaces,当 session 过期时在受限页面上触发请求时,服务器默认返回由 <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,特殊的 JSF ajax 重定向响应的形式为 <partial-response><redirect url="originalURL">返回而不是整个登录页面,并且再次触发安全约束,但这次使用真正的同步请求而不是 JSF ajax 请求。当服务器返回整个<form-login-page>时,这样就可以正常工作了。

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

根据 this commitOmniPartialViewContext 中生成 ajax 重定向之前,我通过再次显式使 session 无效来绕过它。 。该修复已在 OmniFaces 2.3 中提供。

关于jsf - <partial-response> XML 在 WildFly 中的安全约束上进行 ajax 重定向后显示为纯文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35841356/

相关文章:

eclipse - 如何使用 JDK8 在 Eclipse 中导入 javax.faces 库?

java - Java 8 中默认的 Full GC 间隔是多少

java - Wildfly 中的 WAR 扩展策略

java - 验证抛出 java.security.InvalidKeyException : null

jsf - 如何将OmniFaces与Spring Boot集成

html - Primefaces 数据表 colspan 列宽 - 不工作

jsf - 未调用 PrimeFaces fileDownload 方法?

jsf - 在 servlet 中注入(inject) OmniFaces ViewScoped bean 时出现 ContextNotActiveException

使用 arquillian+omnifaces 运行测试时出现 java.util.ServiceConfigurationError

jsf - 如何从支持 bean 内部获取托管 bean 名称?