Con esta guía vamos a poder crear páginas JSF que pueden ser accedidas sin necesidad de crear una sesión Web en el servidor.

Para poder crear páginas JSF, necesitamos crear un fichero XHTML, que contendrá una etiqueta <f:view> (este elemento, suele estar definido en los ficheros de template de las páginas), para indicar que esa página no necesita sesión web, hay que indicar que la vista es transient:

<f:view transient="true">
    <!-- Contenido de la página -->

</f:view>


Cuando se activa esta configuración, entonces no podemos usar componentes de ámbito sesión, conversación o página. Solo se pueden usar componentes con ámbito evento (Request), stateless o aplicación.

En realidad, los componentes de ámbito sesión, conversación o página están disponibles. Gracias al filtro <web:no-session-request-filter> podrás usarlos, pero no guardaran su contexto/estado entre peticiones. Solo están disponibles para evitar posibles errores en el acceso a los componentes.


Una vez creada la sesión Web, todas las peticiones la usaran, incluidas las indicadas en <web:no-session-request-filter>.



Configuración en Aplicaciones FundeWeb v2

A partir del arquetipo de aplicaciones FundeWeb 2.0 versión 2.0.12, no es necesario realizar estas configuraciones.


En el fichero components.xml, tenemos que añadir el siguiente filtro:

<!-- Restful or no Session request -->
<web:no-session-request-filter disabled="false" installed="true" 
     regex-url-pattern="(/error|/error_cas|/portal|/politicaCookies|/politicaPrivacidad|/declaracionAccesibilidad|/fundeweb/40\d|/fundeweb/50\d|/fundeweb/accessLock|/fundeweb/error_auth_method|/fundeweb/error_no_auth)\.seam|/rest/.*|/javax\.faces\.resource/.*|/resources/.*"/>

donde indicamos las páginas web que no necesitan sesión web para poder visualizarse. Si queremos añadir nuevas páginas, es en este filtro donde debemos añadirlas.

Si la aplicación contiene las páginas:

  • /paginas/politicaCookies.xhtml
  • /paginas/politicaPrivacidad.xhtml

estas, se mueven a la carpeta raíz del modulo Web (carpeta /web/src/main/webapp). Además, tendremos que modificar las navegaciones a estas páginas, que suelen definirse en:

  • /layout/avisoCookies.xhtml
  • /layout/avisoCookiesGestion.xhtml
  • /layout/avisoPrivacidad.xhtml
  • /layout/template.xhtml


En la carpeta /layout, creamos una copia del fichero template.xhtml y la renombramos como template_transient_view.xhtml. Y realizamos las siguientes modificaciones:

  • Si se importa el fichero Javascript sessiontimer.js, a su componente <h:outputScript>, le añadimos rendered="#{not org.jboss.seam.web.session.fakeSession}"
  • En la etiqueta <f:view> añadimos la propiedad transient con valor true.
  • Si la página usa un componente <fdw:onloadScript> para realizar una invocación sobre sessionController, entonces en la línea anterior añadimos: <c:if test="#{not org.jboss.seam.web.session.fakeSession}">, que cerraremos en la línea posterior a la etiquete de cierre (</p:dialog>) del dialogo con ID noSesionDlg.


Modificamos el template (normalmente /layout/template.xhtml) por /layout/template_transient_view.xhtml usado en los ficheros:

  • politicaCookies.xhtml
  • politicaPrivacidad.xhtml
  • error.xhtml
  • error_cas.xhtml (esta página puede ser JSP, por lo que no se puede realizar el cambio a no ser que se actualice su contenido por la versión JSF)


Se puede crear una página en la raiz del módulo Web (carpeta /web/src/main/webapp), llamada portal.xhtml, con el siguiente contenido:

<ui:composition template="/layout/template_transient_view.xhtml"
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:s="http://jboss.org/schema/seam/taglib"
	xmlns:p="http://primefaces.org/ui"
	xmlns:pe="http://primefaces.org/ui/extensions"
	xmlns:fw="http://www.um.es/atica/fundeweb">

	<ui:define name="page-title">#{messages['value.link.home']} - #{messages['application.title']}</ui:define>

	<ui:define name="body">
		<!-- CONTENIDO -->
		<h1 class="titulo-pagina">Portal</h1>
		<p:panel header="header" footer="footer" menuTitle="menuTitle"
			toggleable="true" toggleTitle="toggleTitle" closable="true"
			closeTitle="closeTitle">
			
			<h:outputText value="Portal sin sesion web." />
			<br/>
			<p:link id="homeLink" outcome="home">
				<i class="fa fa-home fa-4x" style="color:#B02129;"></i>
				<br/>
				<h:outputText value="#{messages['value.link.home']}" style="color:#B02129; text-decoration:underline;"/>
			</p:link>
		
		</p:panel>
	</ui:define>
</ui:composition>


El contenido de esta página se puede cargar con la información que se desee. Incluso puede ser el objetivo configurado en el fichero index.html.

Si la aplicación tiene en la carpeta raíz del módulo Web (carpeta /web/src/main/webapp) un fichero robots.txt (sino, se puede crear con la guía Creación y configuración de ficheros robots.txt), este, se puede dejar con esta configuración:

User-agent: *
Disallow: /
Allow: /contexto_aplicacion/portal.seam
Allow: /contexto_aplicacion/declaracionAccesibilidad.seam
Allow: /contexto_aplicacion/politicaCookies.seam
Allow: /contexto_aplicacion/politicaPrivacidad.seam
Allow: /contexto_aplicacion/fundeweb/400.seam
Allow: /contexto_aplicacion/fundeweb/401.seam
Allow: /contexto_aplicacion/fundeweb/403.seam
Allow: /contexto_aplicacion/fundeweb/404.seam
Allow: /contexto_aplicacion/fundeweb/500.seam
Allow: /contexto_aplicacion/fundeweb/501.seam
Allow: /contexto_aplicacion/fundeweb/503.seam
Crawl-delay: 10


siempre y cuando esas páginas indicadas en el fichero, realmente existan.


El valor de contexto_aplicacion, es propio de la aplicación, es decir, que no no solo hay que pegar el contenido del fichero, también hay que modificarlo para que sea correcto para la aplicación.


No es recomendable que el fichero robots.txt contenga la entrada

Allow: /contexto_aplicacion/index.html


porque esta entrada suele redirigir a la autenticación y por lo tanto creara una sesión web que durara como mínimo 30 minutos (configurado en el fichero web.xml).

Lo más recomendable, es que el fichero index.html, redirija a la página portal.xhtml, y que a partir de esta, vayamos a la zona principal de la aplicación.