Tabla de Contenidos

Añadir Cookies y Headers HTTP en navegaciones de ficheros pages.xml o .page.xml

Modificaciones para tener más opciones para trabajar con Cookies y Headers HTTP.

Cabeceras HTTP

Hasta ahora podiamos añadir Headers HTTP en los ficheros pages.xml o .page.xml de manera global. Ahora lo podemos hacer especificando en que navegaciones o errores se quieren añadir. Además se ha añadido el atributo if (expresión EL) y on-postback (true/false) para poder condicionar si se añade esa cabecera.

Ejemplo de lo que hasta ahora era posible realizar:

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.org/schema/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.org/schema/seam/pages http://jboss.org/schema/seam/pages-2.3.xsd"
      login-required="true">
 
	<header name="My-Header" value="mi_header_value" />
 
</page>

Con esta configuración, se añade la cabecera My-Header en la respuesta de cualquier navegación desde la página actual.

Ejemplo de añadir una cabecera al <redirect>.

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.org/schema/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.org/schema/seam/pages http://jboss.org/schema/seam/pages-2.3.xsd">
 
 
   <navigation from-action="#{identity.login}">
      <rule if="#{identity.loggedIn}">
		<redirect view-id="/${viewid.pagina.principal}">
			<header name="My-Header" value="200" />
		</redirect>
      </rule>
   </navigation>
 
</page>

Con esta configuración, se añade la cabecera My-Header cuando se ejecuta el <redirect>.

Ejemplo de añadir una cabecera al <render>.

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.org/schema/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.org/schema/seam/pages http://jboss.org/schema/seam/pages-2.3.xsd">
 
 
   <navigation from-action="#{identity.login}">
      <rule if="#{identity.loggedIn}">
		<render view-id="/${viewid.pagina.principal}">
			<header name="My-Header" value="200" />
		</render>
      </rule>
   </navigation>
 
</page>

Con esta configuración, se añade la cabecera My-Header cuando se ejecuta el <render>.

Cabeceras en Excepciones o Errores HTTP

Podemos definir ante excepciones, si queremos realizar una navegacion a una página o devoler un error HTTTP. Estas configuraciones se pueden realizar mediante el fichero pages.xml o mediante anotaciones en clases de Excepción.

Definiciones en pages.xml

Para definir la navegación a una página o devovler un error HTTP en el fichero pages.xml. Ejemplo de navegación como respuesta auna excepción no controlada:

    <exception class="org.jboss.seam.security.AuthorizationException">
        <redirect view-id="/error.xhtml">
            <message severity="error">#{messages['org.jboss.seam.security.AuthorizationException']}</message>
        </redirect>
    </exception>

Donde si se produce la excepción org.jboss.seam.security.AuthorizationException navegamos a la página /error.xhtml mostrando un mensaje.

Ejemplo de respuesta con error HTTP:

    <exception class="org.jboss.seam.ConcurrentRequestTimeoutException" log-level="trace">
        <http-error error-code="503" />
    </exception>

Donde si se produce la excepción org.jboss.seam.ConcurrentRequestTimeoutException se devuelve el error HTTP 503.

Ahora podemos además, añadir cabeceras HTTP en las respuestas:

    <exception class="org.jboss.seam.security.AuthorizationException">
        <redirect view-id="/error.xhtml">
            <message severity="error">#{messages['org.jboss.seam.security.AuthorizationException']}</message>
            <header name="My-Header-redirect" value="200" />
        </redirect>
    </exception>
 
    <exception class="org.jboss.seam.ConcurrentRequestTimeoutException" log-level="trace">
        <http-error error-code="503">
            <header name="My-Header-redirect" value="200" />
        </http-error>
    </exception>


Definiciones en Clases JAVA

Ahora vamos a ver el equivalente mediante anotaciones. Para realizar una navegación como respuesta a una excepción no tratada, usamos la @Redirect. Ahora tenemos disponible la propiedad headers, que nos permite añadir anotaciones @Header, con los datos de la cabecera. Ejemplo:

package es.um.atica.prueba.exceptions;
 
import org.jboss.seam.annotations.exception.Cookie;
import org.jboss.seam.annotations.exception.Header;
import org.jboss.seam.annotations.exception.Redirect;
 
@Redirect(
    viewId = "/paginas/home.seam",
    headers = { @Header(name = "annotation_header", value = "#{cookieManager.value}") })
public class RedirectException extends RuntimeException {
 
}

Cuando se lance la excepción es.um.atica.prueba.exceptions.RedirectException y no sea tratada, automaticamente se realizara una navegación a la página /paginas/home.seam y en la respuesta se añade la cabecera annotation_header.

Para devolver un error HTTP ante una excepción no tratada, utilizamos la anotación @HttpError.Ahora tenemos disponible la propiedad headers, que nos permite añadir anotaciones @Header, con los datos de la cabecera. Ejemplo:

package es.um.atica.prueba.exceptions;
 
import org.jboss.seam.annotations.exception.Cookie;
import org.jboss.seam.annotations.exception.Header;
import org.jboss.seam.annotations.exception.Redirect;
 
@HttpError(
    errorCode = 503,
    message = "#{messages['my.error.menssage']}"
    headers = { @Header(name = "annotation_header", value = "#{cookieManager.value}") })
public class HttpErrorException extends RuntimeException {
 
}

Cuando se lance la excepción es.um.atica.prueba.exceptions.HttpErrorException y no sea tratada, automaticamente se devuelve el error HTTP 503 y en la respuesta se añade la cabecera annotation_header.

Atributos

Los atributos de la etiqueta <header> son los siguientes:

Cookies HTTP

Hasta ahora NO podiamos añadir Cookies HTTP en los ficheros pages.xml o .page.xml. Ahora lo podemos hacer de manera global a una página o especificando en que navegaciones o errores se quieren añadir. Además se ha añadido el atributo if (expresión EL) y on-postback (true/false) para poder condicionar si se añade esa cabecera.

Ejemplo de uso para añadir cookie a de manera global a una página:

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.org/schema/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.org/schema/seam/pages http://jboss.org/schema/seam/pages-2.3.xsd"
      login-required="true">
 
	<cookie name="My-Cookie" value="mi_cookie_value" />
 
</page>

Con esta configuración, se añade la cookie My-Cookie en la respuesta de cualquier navegación desde la página actual.

Ejemplo de añadir una cabecera al <redirect>.

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.org/schema/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.org/schema/seam/pages http://jboss.org/schema/seam/pages-2.3.xsd">
 
 
   <navigation from-action="#{identity.login}">
      <rule if="#{identity.loggedIn}">
		<redirect view-id="/${viewid.pagina.principal}">
			<cookie name="My-Cookie" value="mi_cookie_value" />
		</redirect>
      </rule>
   </navigation>
 
</page>

Con esta configuración, se añade la cookie My-Cookie cuando se ejecuta el <redirect>.

Ejemplo de añadir una cabecera al <render>.

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.org/schema/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.org/schema/seam/pages http://jboss.org/schema/seam/pages-2.3.xsd">
 
 
   <navigation from-action="#{identity.login}">
      <rule if="#{identity.loggedIn}">
		<render view-id="/${viewid.pagina.principal}">
			<cookie name="My-Cookie" value="mi_cookie_value" />
		</render>
      </rule>
   </navigation>
 
</page>

Con esta configuración, se añade la cookie My-Cookie cuando se ejecuta el <render>.

Cookies en Excepciones o Errores HTTP


Definiciones en pages.xml

Ahora podemos además, añadir cookies HTTP en las respuestas:

    <exception class="org.jboss.seam.security.AuthorizationException">
        <redirect view-id="/error.xhtml">
            <message severity="error">#{messages['org.jboss.seam.security.AuthorizationException']}</message>
            <cookie name="My-Cookie-redirect" value="MY_cookie_value" />
        </redirect>
    </exception>
 
    <exception class="org.jboss.seam.ConcurrentRequestTimeoutException" log-level="trace">
        <http-error error-code="503">
            <cookie name="My-Cookie-error" value="MY_cookie_value" />
        </http-error>
    </exception>


Definiciones en Clases JAVA

Ahora vamos a ver el equivalente mediante anotaciones. Para realizar una navegación como respuesta a una excepción no tratada, usamos la @Redirect. Ahora tenemos disponible la propiedad cookies, que nos permite añadir anotaciones @Cookie, con los datos de la cookie. Ejemplo:

package es.um.atica.prueba.exceptions;
 
import org.jboss.seam.annotations.exception.Cookie;
import org.jboss.seam.annotations.exception.Header;
import org.jboss.seam.annotations.exception.Redirect;
 
@Redirect(
    viewId = "/paginas/home.seam",
    cookies = { @Cookie(name = "annotation_cookie", value = "#{cookieManager.value}", path = "/miPath") })
public class RedirectException extends RuntimeException {
 
}

Cuando se lance la excepción es.um.atica.prueba.exceptions.RedirectException y no sea tratada, automaticamente se realizara una navegación a la página /paginas/home.seam y en la respuesta se añade la cookie annotation_cookie.

Para devolver un error HTTP ante una excepción no tratada, utilizamos la anotación @HttpError.Ahora tenemos disponible la propiedad cookies, que nos permite añadir anotaciones @Cookie, con los datos de la cabecera. Ejemplo:

package es.um.atica.prueba.exceptions;
 
import org.jboss.seam.annotations.exception.Cookie;
import org.jboss.seam.annotations.exception.Header;
import org.jboss.seam.annotations.exception.Redirect;
 
@HttpError(
    errorCode = 503,
    message = "#{messages['my.error.menssage']}"
    cookies = { @Cookie(name = "annotation_cookie", value = "#{cookieManager.value}", path = "/miPath") })
public class HttpErrorException extends RuntimeException {
 
}

Cuando se lance la excepción es.um.atica.prueba.exceptions.HttpErrorException y no sea tratada, automaticamente se devuelve el error HTTP 503 y en la respuesta se añade la cookie annotation_cookie.

Atributos

Los atributos de la etiqueta <cookie> son los siguientes:


JUAN MIGUEL BERNAL GONZALEZ 28/01/2020 11:44