jsf - <partial-response> XML se muestra como texto sin formato después de ajax redirigir en la restricción de seguridad en WildFly
omnifaces security-constraint (1)
Tengo este extraño problema con ajax redirigir en una restricción de seguridad:
Cuando se realiza una llamada ajax (haciendo clic en una columna ordenable p:dataTable
o cuando se desencadena una p:poll
) en una página protegida por roles después de que se agotó el tiempo de espera de la sesión, una <partial-response><redirect-url=...
XML de OmniFaces se muestra en la pantalla.
Cuando elimino OmniFaces, las llamadas ajax parecen fallar silenciosamente y no aparece el XML.
La seguridad se configura de la siguiente manera en 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>
Lo reproduje Esta es una extraña peculiaridad / error en WildFly.
¿Que esta pasando aqui?
De forma predeterminada, sin OmniFaces, cuando una solicitud se activa en una página restringida mientras la sesión expira, el servidor devuelve por defecto la página HTML completa identificada por <form-login-page>
como respuesta, independientemente del origen de la solicitud. Esto obviamente falla con las solicitudes JSF ajax ya que el JavaScript responsable de procesar las solicitudes ajax no podía tratar con una página HTML completa como respuesta donde esperaba una respuesta XML especial. El usuario no tiene ninguna forma de retroalimentación. Esto se debe a OmniFaces 1.2 corregido en su OmniPartialViewContext
, desencadenado por esta pregunta relacionada: ViewExpiredException no lanzada en la solicitud ajax si la página JSF está protegida por j_security_check .
Con OmniFaces, se devuelve una respuesta JSF ajax redirect en forma de <partial-response><redirect url="originalURL">
lugar de la página de inicio de sesión completa, y la restricción de seguridad se activa una vez más, pero esta vez con una sincronización real solicitar en lugar de una solicitud JSF ajax. Cuando el servidor devuelve la <form-login-page>
, funcionaría bien de esta manera.
WildFly (probado solo 10.0.0 a partir de ahora), sin embargo, parece almacenar en caché toda la respuesta de <form-login-page>
de la primera restricción de seguridad golpeada en la sesión (mientras que se espera que guarde solo la solicitud asociada) y devuelva exactamente esa respuesta en cada golpe de una solicitud restringida. Es por eso que ves la <partial-response>
XML <partial-response>
inicial cada vez.
De acuerdo con este compromiso lo he evitado al invalidar explícitamente la sesión una vez más antes de generar la redirección ajax en OmniPartialViewContext
. La solución está disponible en OmniFaces 2.3.