2010-02-22 26 views
31

Estoy manteniendo una aplicación web Java.httpservletrequest - crear nueva sesión/cambiar sesión Id

Al examinar el código de inicio de sesión, se obtiene una HttpSession de HttpServletRequest a través del método getSession() de HttpServletRequest. (Utiliza algunos valores en la sesión para fines de autenticación)

Sin embargo, me preocupan los ataques de fijación de sesión, así que después de haber utilizado la sesión inicial deseo iniciar una nueva sesión o cambiar la identificación de la sesión. es posible?

Respuesta

37

La API de Servlet 3.0 no le permite cambiar la identificación de la sesión en una sesión existente. Por lo general, para protegerse contra la fijación de sesiones, querrá simplemente crear uno nuevo e invalidar el anterior también.

Puede invalidar una sesión como esta

request.getSession(false).invalidate(); 

y luego crear una nueva sesión con

getSession(true) (getSession() debería funcionar también)

Obviamente, si usted tiene un conjunto de datos en la sesión que desea persistir, deberá copiarlo desde la primera sesión hasta la segunda sesión.

Nota, para la protección de la fijación de la sesión, se considera que está bien simplemente hacer esto en la solicitud de autenticación. Pero un mayor nivel de seguridad implica lanzar la sesión anterior y hacer una nueva sesión para cada solicitud.

+3

¿No se supone que debe dar una NullPointerException cuando no se ha llamado a getSession antes? – FRotthowe

+0

Es cierto, pero creo que estamos suponiendo que la sesión existe. – pablochan

+3

Te recomendaría si has usado 'getSession()' en lugar de 'getSession (boolean)'. – BalusC

23

Desde Java EE 7 y Servlet API 3.1 (Tomcat 8) puede usar HttpServletRequest.changeSessionId() para lograr dicho comportamiento. También hay un oyente HttpSessionIdListener que se invocará después de cada cambio.

+0

Shiro y changeSessionId es una combinación poderosa. Me permite escribir mi lógica de lava sin distracciones 'if (success) request.changeSessionId()' no es necesario volver a escribir, estoy nere – lrn2prgrm

Cuestiones relacionadas