java - ¿Puedo desactivar HttpSession en web.xml?
web-applications (9)
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. La desactivación de HttpSession
sería una violación de las especificaciones de 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 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
reemplaza a getSession()
. Pero no perdería el tiempo implementando esto :)
Actualización: mi sugerencia inicial no fue óptima, la forma "correcta" ( tos ) sería reemplazar la solicitud.
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 (que es lo que aglomera los resultados de búsqueda cuando hago una búsqueda en Google).
PS: ¿Es esta una mala idea? Prefiero deshabilitar completamente las cosas hasta que realmente las necesite.
Me gustaría eliminar la HttpSession por completo
No puedes deshabilitarlo por completo. Todo lo que necesita hacer es simplemente no obtener un control de ello mediante request.getSession()
o request.getSession(true)
en cualquier parte del código de su aplicación web y asegurándose de que sus JSP no hagan eso implícitamente estableciendo <%@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 web específica del servidor. En, por ejemplo, Tomcat puede establecer el atributo de cookies
en false
en el elemento <Context>
.
<Context cookies="false">
También vea esta documentación específica de Tomcat . 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, simplemente no lo agarre, entonces no será creado / retenido en absoluto.
O bien, si ya tiene Java EE 6 / Servlet 3.0 o posterior, y realmente quiere hacerlo a través de web.xml
, puede usar el nuevo elemento <cookie-config>
en web.xml
siguiente manera para poner a cero la edad máxima:
<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 devuelva una HttpSession
(o una HttpSession
"vacía"), deberá crear un filtro que escuche en un url-pattern
de /*
que reemplace el HttpServletRequest
con un Implementación HttpServletRequestWrapper
que devuelve getSession()
todos los métodos getSession()
, o una implementación HttpSession
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);
}
PS: ¿Es esta una mala idea? Prefiero deshabilitar completamente las cosas hasta que realmente las necesite.
Si no los necesita, simplemente no los use. Eso es todo. De Verdad :)
A partir de Servlet 3.0, puede hacerlo para que el contenedor de servlets no contextInitialized
las contextInitialized
de ninguna manera, agregando un código como este al método contextInitialized
de un ServletContextListener
:
servletContext.setSessionTrackingModes(Collections.emptySet());
En Spring Security 3 con Java Config, puede usar HttpSecurity.sessionManagement ():
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
Xml se ve así;
<http create-session="stateless">
<!-- config -->
</http>
Por cierto, la diferencia entre NUNCA y STATELESS
NUNCA: Spring Security nunca creará una HttpSession, pero usará la HttpSession si ya existe
STATELESS: Spring Security nunca creará una HttpSession y nunca la usará para obtener el SecurityContext
En lugar de deshabilitarlo, puede volver a escribir la URL utilizando un filtro de reescritura de URL, por ejemplo, el filtro de reescritura de tuckey . 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 solo el motor de búsqueda antipático. Expone el ID de sesión que se puede usar para ciertos exploits de seguridad .
Ejemplo de configuración para el filtro Tuckey:
<outbound-rule encodefirst="true">
<name>Strip URL Session ID''s</name>
<from>^(.*?)(?:/;jsessionid=[^/?#]*)?(/?[^#]*)?(#.*)?$</from>
<to>$1$2$3</to>
</outbound-rule>
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 accede independientemente de que llame a request.getSession()
o no.
Si está compilando una aplicación de carga alta sin estado, puede desactivar el uso de cookies para el seguimiento de sesión de esta manera (no intrusivo, probablemente no dependiente del contenedor):
<session-config>
<tracking-mode>URL</tracking-mode>
</session-config>
Para hacer cumplir esta decisión arquitectónica, escriba 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éguelo a web.xml y arregle los lugares donde falla con esa excepción:
<listener>
<listener-class>com.ideas.bucketlist.web.PreventSessionListener</listener-class>
</listener>
Uno no 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, crea un filtro de servlet simple, que colocas primero y después de que chain.doFilter arroje una excepción si se creó una sesión:
chain.doFilter(request, response);
if(request.getSession(false) != null)
throw new RuntimeException("Somewhere request.getSession() was called");
Utilizo el siguiente método para mi aplicación RESTful para eliminar cualquier cookie de sesión inadvertida de la creación y el uso.
<session-config>
<session-timeout>1</session-timeout>
<cookie-config>
<max-age>0</max-age>
</cookie-config>
</session-config>
Sin embargo, esto no apaga 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 realizar un seguimiento cuando ocurra.