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

Posted

技术标签:

【中文标题】<partial-response> XML 在 WildFly 中安全约束的 ajax 重定向后显示为纯文本【英文标题】:<partial-response> XML shown as plain text after ajax redirect on security constraint in WildFly 【发布时间】:2016-06-20 20:42:03 【问题描述】:

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

当我的会话超时后在角色安全页面上进行 ajax 调用(通过单击可排序的 p:dataTable 列或触发 p:poll 时)时,来自 OmniFaces 的 &lt;partial-response&gt;&lt;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>

【问题讨论】:

要排除一个和另一个,如果您保留*.xhtml URL 模式并省略/javax.faces.resource/* URL 模式和UnmappedResourceHandler 怎么办? 删除/javax.faces.resource/*UnmappedResourceHandler后问题依旧 好的,因此与UnmappedResourceHandler 无关。我建议根据新发现重新构建您的问题。您使用的是哪个身份验证框架和哪个服务器? 你是对的。我正在使用 Wildfly 10 的内置 JAAS 身份验证。 转载了它,这是 WildFly 特有的怪癖/错误。我在 OmniFaces 2.3 SNAPSHOT 中有fixed。可以试试吗? 【参考方案1】:

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

这里发生了什么?

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

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

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

【讨论】:

当我在隐身/私密模式下使用浏览器进行测试时,我无法重现 *.jsf / *.xhtml 问题。所以,这可能是我这边的某种缓存问题。 它也适用于 WildFly 8.2.0。如果在会话超时后发出 Ajax 请求,则会显示 。 OmniFaces 2.3-SNAPSHOT 是否适用于 Jsf 2.3?什么时候可以正式版使用这个Bugfix? 不,OmniFaces 2.x 仍然适用于 JSF 2.2。只有 OmniFaces 3.x 将用于 JSF 2.3。我预计这周会发布 OmniFaces 2.3 RC1(最重要的部分, 终于和成品一样好了) 谢谢,你帮了大忙。 @BalusC,在这个答案上:***.com/a/12505713/309402 你提供了几乎完整的解决方案,按照你在提交中所做的,我认为它只是缺少 invalidateSession() 在试试 语句?如果是这样,如果您在回答中为像我这样不依赖omnifaces的人添加缺少的行,那就太好了。

以上是关于<partial-response> XML 在 WildFly 中安全约束的 ajax 重定向后显示为纯文本的主要内容,如果未能解决你的问题,请参考以下文章

<em> 中的 <strong> 或 <strong> 中的 <em> 重要吗?

将 Single<List<Maybe<Book>>> 转换为 Single<List<Book>>

根据键将 List<List<List<T>>> 转换为 List<List<T>>

LL文法

前端初步预习

Rc<RefCell<T>> 和 RefCell<Rc<T>> 有啥区别?