2010-11-04 10 views
9

En JSP, hay un atributo sesión utilizado para deshabilitar sesión de generación automática en una solicitud.Sin generación de sesión en jsf

<%@page contentType="text/html" pageEncoding="UTF-8" session="false" %> 

¿Hay alguna manera de hacer lo mismo en JSF2?

Gracias

¿Por qué? Porque tenemos una página de formulario de registro público como página predeterminada en una aplicación. Es una forma muy simple y la sesión se crea cada vez que personas (o robots, etc.) solicitan la página principal. ManagedBean es RequestScope, pero JSF crea una sesión en la primera solicitud de navegación.

+0

@BalusC Agregado por qué en cuestión. – angelcervera

Respuesta

7

simplemente no lo utiliza vista/sesión en ámbito granos (por lo que sólo utilizan solicitud o una aplicación en ámbito frijoles) y el estado ajustar el horario a client en lugar de (predeterminado) server estableciendo el siguiente parámetro de contexto en web.xml.

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 

Entonces JSF no creará la sesión y almacenará el estado de la vista en un campo de entrada oculto con el nombre javax.faces.ViewState en forma siempre que sea necesario.

El costo de crear y administrar las sesiones es bastante despreciable. Además, aún tiene que sacrificar el costo de (de) serializar el estado de la vista y el ancho de banda de la red cuando se usa el ahorro de estado de la vista lateral del cliente.


actualización como por su comentario:

@BalusC Sí, esto podría ser una solución global. Pero necesito este método solo en esta página pública. En otras páginas quiero el método de ahorro de estado del lado del servidor.

Ah right. Lo siento, no veo ninguna forma agradable en JSF/Facelets para deshabilitar la sesión o cambiar el estado de la vista guardando por solicitud. Consideraría utilizar un HTML simple <form> en lugar de un JSF <h:form>, dejarlo enviar a otra página JSF y hacer uso de @ManagedProperty en el bean asociado con la página JSF. P.ej.

<form action="register.jsf" method="post"> 
    <input type="text" name="username" /> 
    <input type="password" name="password" /> 
    <input type="submit" /> 
</form> 

con

@ManagedBean 
@RequestScoped 
public class Register { 

    @ManagedProperty(value="#{param.username}") 
    private String username; 

    @ManagedProperty(value="#{param.password}") 
    private String password; 

    @PostConstruct 
    public void init() { 
     // Do your thing here. 
     System.out.println("Submitted username/password: " + username + "/" + password); 
    } 

    // ... 
} 
2

responder realidad de BalusC no es correcto ya que Mojarra 2.1.19/2.2.0. Puede leer sobre esto en su blog here. Ahora totalmente suficiente único conjunto:

<f:view transient="true"> 
    Your regular content 
</f:view> 

Como se ha dicho en el post mencionado:

El estado de vista no se ha creado y por lo tanto también la sesión no se crea cuando no se ha creado todavía. [...] Recuerde poner el bean administrado asociado en el alcance de la solicitud en lugar del alcance de la vista/sesión, de lo contrario, simplemente está derrotando el significado de la palabra "sin estado".

código siguiente fragmento presente en com.sun.faces.application.view.FaceletViewHandlingStrategy clase:

 /* 
     * Make sure we have a session here if we are using server state 
     * saving. The WriteBehindStateWriter needs an active session when 
     * it writes out state to a server session. 
     * 
     * Note if you flag a view as transient then we won't acquire the 
     * session as you are stating it does not need one. 
     */ 
     if (isServerStateSaving() && !viewToRender.isTransient()) { 
      getSession(ctx); 
     }  

También tenga en cuenta que algunos componentes bibliotecas 3 ª parte, por ejemplo, ICEfaces u otros marcos, p. Apache Shiro, podría crear sesión por sí mismo para algunos propósitos propios.

Cuestiones relacionadas