Pregunta

Me gustaría eliminar el HttpSession por completo - puedo hacer esto en web.xml? Estoy seguro de que hay maneras de contenedores específicos para hacerlo (que es lo que llena los resultados de búsqueda cuando hago una búsqueda en Google).

P.S. ¿Es una mala idea? Yo prefiero desactivar por completo las cosas hasta que realmente los necesite.

¿Fue útil?

Solución

  

Me gustaría eliminar el HttpSession completamente

No se puede desactivar en su totalidad. Todo lo que necesita hacer es simplemente no para obtener un identificador de la misma por cualquiera request.getSession() o request.getSession(true) en cualquier parte del código de su aplicación web y asegurarse de que las JSP no lo hacen implícitamente que al establecer <%@page session="false"%>.

Si su principal preocupación es realmente incapacitante la cookie que se ha utilizado detrás de las escenas de HttpSession, entonces se puede en Java EE 5 / servlet 2.5 sólo lo hacen en la configuración específica del servidor de aplicación web. En, por ejemplo, Tomcat puede establecer el atributo cookies a false en el elemento <Context>.

<Context cookies="false">

También ver esto Tomcat documentación específica . De esta manera la sesión no será retenido en las solicitudes posteriores que no se vuelven a escribir url---only cada vez que agarras de la solicitud por alguna razón. Después de todo, si usted no lo necesita, solo no agarrarlo, entonces no va a ser creados / retenidos en absoluto.

O, si ya se encuentra en Java EE 6 / Servlet 3.0 o posterior, y realmente querer 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 devuelve un HttpSession (o un HttpSession "vacío"), entonces usted tendrá que crear un filtro que escucha en un url-pattern de /* que sustituye al HttpServletRequest con un aplicación HttpServletRequestWrapper que devuelve en todo getSession() métodos null, o una implementación personalizada HttpSession ficticia que no hace nada, o incluso lanza 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? Yo prefiero desactivar por completo las cosas hasta que realmente los necesite.

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

Otros consejos

Si usted está construyendo una aplicación de alta carga sin estado puede deshabilitar el uso de cookies para el seguimiento de sesiones como esta (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 añadirlo a 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>

Yo uso el siguiente método para mi aplicación REST para eliminar las cookies de sesión involuntarios que se creen y utilizado.

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

Sin embargo, esto no se desactiva por completo HttpSessions. Una sesión puede todavía ser creado por la aplicación sin darse cuenta, incluso si desaparece en un minuto y un cliente autorizado podría ignorar la solicitud máximo de edad para la cookie también.

La ventaja de este enfoque es que no es necesario cambiar la aplicación, simplemente web.xml. Yo recomendaría a crear un HttpSessionListener que conectarse cuando se crea o se destruye una sesión para que pueda controlar cuando se produzca.

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: Spring Security nunca se creará una HttpSession y lo hará   Nunca utilizarlo para obtener el SecurityContext

En lugar de la desactivación puede volver a escribir la dirección URL utilizando un filtro de reescritura de URL por ejemplo Tuckey reescribir filtro . Esto dará a los resultados de Google amigables, pero todavía permiten el manejo de sesiones basadas en cookies.

Sin embargo, probablemente debería desactivarlo para todas las respuestas, ya que es peor que los motores de búsqueda hostil. Expone el identificador de sesión que puede ser utilizado para ciertos fallos de seguridad .

Ejemplo config para el filtro de Tuckey :

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

Me gustaría eliminar el HttpSession por completo - puedo hacer esto en web.xml? Estoy seguro de que hay maneras de contenedores específicos para hacerlo

Yo no lo creo. La desactivación del HttpSession sería una violación de la especificación Servlet que establece que HttpServletRequest#getSession debe devolver una sesión o crear una. Así que yo no esperaría que un contenedor Java EE para proporcionar una opción de configuración de ese tipo (que haría no compatible).

  

¿Es esta una mala idea? Yo prefiero desactivar por completo las cosas hasta que realmente los necesite.

Bueno, yo realmente no entiendo el punto, pero no pone nada en la sesión si no desea utilizarlo. Ahora, si realmente desea evitar el uso de la sesión, se puede utilizar un Filter para reemplazar la solicitud con una aplicación de HttpServletRequestWrapper getSession() primordial. Pero yo no pierda el tiempo la aplicación de esta:)

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

A partir de Servlet 3.0, puede que sea lo que las sesiones no se determina el contenedor de servlets en modo alguno, mediante la adición de un código como éste con el método contextInitialized de un ServletContextListener:

servletContext.setSessionTrackingModes(Collections.emptySet());

Javadoc.

Para la aplicación REST, simplemente lo invalidan cada vez que termina el ciclo de vida de la solicitud. Puede haber algún servidor web que siempre crea nueva sesión cuando el nuevo acceso del cliente si se llama a request.getSession() o no.

No se puede evitar la creación de la sesión. Sin embargo, se puede comprobar si se violan sus propias necesidades al final de un ciclo de petición. 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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top