2010-02-12 15 views
47

Me gustaría eliminar la HttpSession por completo. ¿Puedo hacer esto en web.xml? Estoy seguro de que hay formas específicas de contenedor para hacerlo (que es lo que aglomera los resultados de búsqueda cuando hago una búsqueda en Google).¿Puedo desactivar HttpSession en web.xml?

P.S. ¿Es una mala idea? Prefiero deshabilitar completamente las cosas hasta que realmente las necesite.

+3

¡Qué pregunta tan interesante! Tengo una situación en la que con Tomcat, no se está creando ninguna sesión para mí, así que estaba buscando si había una manera de activar la sesión _on_ en web.xml. : D – Trejkaz

Respuesta

65

quisiera eliminar la HttpSession completamente

No se puede desactivar en su totalidad. Todo lo que tiene que hacer es simplemente no para obtener un identificador de request.getSession() o request.getSession(true) en cualquier parte del código de su aplicación web y asegurarse de que sus JSP no lo hagan implícitamente configurando <%@page session="false"%>.

Si su principal preocupación es realmente deshabilitar la cookie que se utiliza detrás de las escenas de HttpSession, entonces en Java EE 5/Servlet 2.5 solo puede hacerlo en la configuración de aplicación de aplicaciones específica del servidor. En, por ejemplo, Tomcat, puede establecer el atributo cookies en false en el elemento <Context>.

<Context cookies="false"> 

Ver también este Tomcat specific documentation.De esta forma, la sesión no se retendrá en las solicitudes subsiguientes que no se reescriban en la URL, solo cada vez que la solicite por algún motivo. Después de todo, si no lo necesita, solo no lo agarre, entonces no será creado/retenido en absoluto.

O, si ya se encuentra en Java EE 6/Servlet 3.0 o posterior, y realmente quiere hacerlo a través de web.xml, a continuación, se puede utilizar el nuevo elemento <cookie-config> en web.xml de la siguiente manera a cero el máximo de edad:

<session-config> 
    <session-timeout>1</session-timeout> 
    <cookie-config> 
     <max-age>0</max-age> 
    </cookie-config> 
</session-config> 

Si desea codificar en su aplicación web para que getSession() nunca se devuelve un HttpSession (o un "vacío" HttpSession), entonces usted tendrá que crear un filtro que escucha en un url-pattern de /* que sustituye al HttpServletRequest con una implementación de HttpServletRequestWrapper que devuelve todos los getSession() métodos null, o una implementación simulada personalizada HttpSession que no hace nada, o incluso arroja UnsupportedOperationException.

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) { 
     @Override 
     public HttpSession getSession() { 
      return null; 
     } 
     @Override 
     public HttpSession getSession(boolean create) { 
      return null; 
     } 
    }, response); 
} 

P. S. ¿Es una mala idea? Prefiero deshabilitar completamente las cosas hasta que realmente las necesite.

Si no los necesita, simplemente no los use. Eso es todo. Realmente :)

+0

@balus ... + 1 para una gran explicación :) –

+5

El 'HttpServletRequestWrapper' suena bien, me gustaría ir con eso. En un proyecto grande con muchos desarrolladores, se necesita cierta aplicación de decisiones arquitectónicas (como apatridia). No puede confiar en que la gente "simplemente no lo use". –

+4

_ "Si no los necesita, simplemente no los use" _ No es tan simple. Algunas de las cientos de bibliotecas que utiliza su proyecto podrían crear una sesión en alguna parte. –

2

Me gustaría eliminar por completo la HttpSession. ¿Puedo hacer esto en web.xml? Estoy seguro de que hay formas específicas de contenedor para hacerlo

No lo creo. Deshabilitar el HttpSession sería una violación de las especificaciones del servlet que establece que HttpServletRequest#getSession debe devolver una sesión o crear una. Por lo tanto, no esperaría que un contenedor Java EE proporcione dicha opción de configuración (que la haría no conforme).

¿Es esta una mala idea? Prefiero deshabilitar completamente las cosas hasta que realmente las necesite.

Bueno, realmente no entiendo el punto, simplemente no pongas nada en la sesión si no quieres usarlo. Ahora, si realmente desea evitar el uso de la sesión, puede usar un Filter para reemplazar la solicitud con una implementación de HttpServletRequestWrapper anulando getSession(). Pero no perdería tiempo de aplicación de la presente :)

Actualización: Mi sugerencia inicial no era óptima, el "derecho" (tos) forma sería la de sustituir la petición.

2

En lugar de deshabilitarlo, puede volver a escribir la URL utilizando un filtro de reescritura de URL, por ejemplo, tuckey rewrite filter. Esto le dará resultados amigables a Google, pero aún permitirá el manejo de sesión basado en cookies.

Sin embargo, probablemente debería deshabilitarlo para todas las respuestas, ya que es peor que el motor de búsqueda antipático. Expone el ID de sesión que se puede usar para certain security exploits.

Example config de filtro de Tuckey:

<outbound-rule encodefirst="true"> 
    <name>Strip URL Session ID's</name> 
    <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from> 
    <to>$1$2$3</to> 
</outbound-rule> 
1

Para la aplicación RESTful, simplemente lo invalido cada vez que finaliza el ciclo de vida de la solicitud. Puede haber algún servidor web que siempre crea una nueva sesión cuando el nuevo cliente tiene acceso, ya sea que llame al request.getSession() o no.

4

Uso el siguiente método para que mi aplicación RESTful elimine cualquier cookie de sesión inadvertida que se cree y utilizada.

<session-config> 
    <session-timeout>1</session-timeout> 
    <cookie-config> 
     <max-age>0</max-age> 
    </cookie-config> 
</session-config> 

Sin embargo, esto no apaga las HttpSessions por completo. La aplicación aún puede crear una sesión inadvertidamente, incluso si desaparece en un minuto y un cliente deshonesto puede ignorar la solicitud de edad máxima para la cookie también.

La ventaja de este enfoque es que no necesita cambiar su aplicación, solo web.xml. Le recomendaría que cree un HttpSessionListener que se registrará cuando se crea o destruye una sesión para que pueda rastrear cuándo ocurre.

0

No se puede evitar la creación de la sesión. Pero puede verificar si viola sus propios requisitos al final de un ciclo de solicitud. Por lo tanto, crear un filtro de servlet simple, que se coloca como la primera y después de chain.doFilter una excepción si una sesión se creó:

chain.doFilter(request, response); 
if(request.getSession(false) != null) 
    throw new RuntimeException("Somewhere request.getSession() was called"); 
4

Si usted está construyendo una aplicación de alta carga sin estado puede deshabilitar el uso de cookies de sesión el seguimiento de esta manera (no intrusiva, probablemente contenedor agnóstica):

<session-config> 
    <tracking-mode>URL</tracking-mode> 
</session-config> 

para hacer cumplir esta decisión arquitectónica escribir algo como esto:

public class PreventSessionListener implements HttpSessionListener { 
@Override 
public void sessionCreated(HttpSessionEvent se) { 
    throw new IllegalStateException("Session use is forbidden"); 
} 

@Override 
public void sessionDestroyed(HttpSessionEvent se) { 
    throw new IllegalStateException("Session use is forbidden"); 
} 
} 

Y agrégalo a la web.xml y fijar los lugares donde se produce un error con esa excepción:

<listener> 
    <listener-class>com.ideas.bucketlist.web.PreventSessionListener</listener-class> 
</listener> 
1

En la primavera de Seguridad 3 Config con Java, puede utilizar HttpSecurity.sessionManagement():

@Override 
protected void configure(final HttpSecurity http) throws Exception { 
    http 
     .sessionManagement() 
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
} 

XML se parece a esto;

<http create-session="stateless"> 
    <!-- config --> 
</http> 

Por cierto, la diferencia entre NUNCA y STATELESS

NUNCA: Spring Security nunca se creará una HttpSession, pero utilizará la HttpSession si ya existe

STATELESS: Primavera La seguridad nunca creará una HttpSession y lo hará nunca lo use para obtener el SecurityContext

+0

No funciona. –

+0

@ArtemNovikov ¿Cuál es su versión de Spring Security? Este futuro es compatible desde 3.1 –