<частичный-ответ> XML отображается как обычный текст после перенаправления ajax на ограничение безопасности в WildFly

У меня странная проблема с перенаправлением 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 ответ

Решение

Я воспроизвел это. Это странная ошибка в самом WildFly.

Что тут происходит?

По умолчанию, без OmniFaces, когда запрос запускается на ограниченной странице во время истечения сеанса, сервер по умолчанию возвращает всю HTML-страницу, указанную <form-login-page> в качестве ответа, независимо от источника запроса. Это, очевидно, не работает с JSF-запросами ajax, поскольку JavaScript, отвечающий за обработку ajax-запросов, не может обрабатывать целую HTML-страницу как ответ, где он ожидал специального XML-ответа. Пользователь оставлен без формы обратной связи. Это так как OmniFaces 1.2 исправлена ​​в его OmniPartialViewContext, вызванный этим связанным вопросом: исключение ViewExpiredException не генерируется при запросе ajax, если страница JSF защищена j_security_check.

С OmniFaces, специальный ответ перенаправления ajax JSF в виде <partial-response><redirect url="originalURL"> возвращается вместо всей страницы входа в систему, и ограничение безопасности срабатывает еще раз, но на этот раз с реальным синхронным запросом вместо запроса ajax JSF. Когда сервер возвращает весь <form-login-page>, это будет работать нормально.

WildFly (проверено только 10.0.0 на данный момент), однако, кажется, чтобы кэшировать все <form-login-page> ответ на 1-е попадание ограничения безопасности в сеансе (тогда как ожидается, что он будет кэшировать только связанный запрос) и возвращать именно этот ответ при каждом попадании ограниченного запроса. Вот почему вы видите начальный <partial-response> XML ответ каждый раз.

В соответствии с этим коммитом я обошел его, явно лишив возможности сеанса еще раз, перед тем как сгенерировать перенаправление ajax в OmniPartialViewContext, Исправление доступно в OmniFaces 2.3.

Другие вопросы по тегам