java - initializr - spring mvc vs spring boot
Acceso a atributos de sesión de MVC de primavera (3)
La anotación @SessionAttribute
mencionada por @uthark no es adecuada para esta tarea. Pensé que también lo era, pero un poco de lectura muestra lo contrario:
Los atributos de sesión indicados mediante esta anotación corresponden a los atributos del modelo de un manejador específico, y se almacenan de forma transparente en una sesión de conversación. Esos atributos se eliminarán una vez que el controlador indique la finalización de su sesión de conversación. Por lo tanto, use esta función para los atributos de conversación que se supone que se almacenarán en la sesión temporalmente durante el curso de la conversación de un manejador específico.
Para los atributos de sesión permanentes, por ejemplo, un objeto de autenticación de usuario, use el método tradicional session.setAttribute en su lugar. Como alternativa, considere usar las capacidades de administración de atributos de la interfaz genérica de solicitud de Web.
En otras palabras, @SessionAttribute
es para almacenar objetos de modelo MVC de conversación en la sesión (en lugar de almacenarlos como atributos de solicitud). No está diseñado para usar con atributos de sesión arbitrarios. Como descubrió, solo funciona si el atributo de sesión siempre está ahí.
No tengo conocimiento de ninguna otra alternativa, creo que estás atascado con HttpSession.getAttribute()
¿Hay alguna manera en Spring 3.0 para acceder a HttpSession sin incluirlo en la firma del método? Lo que realmente quiero hacer es poder pasar valores de una HttpSession que PUEDE SER NULA.
Algo como esto:
@RequestMapping("/myHomePage")
public ModelAndView show(UserSecurityContext ctx) {}
en lugar de esto:
@RequestMapping("/myHomePage")
public ModelAndView show(HttpSession session) {
UserSecurityContext ctx = (UserSecurityContext) session.getAttribute("userSecurityCtx");
}
Puedes usar un RequestContextHolder
:
class SecurityContextHolder {
public static UserSecurityContext currentSecurityContext() {
return (UserSecurityContext)
RequestContextHolder.currentRequestAttributes()
.getAttribute("userSecurityCtx", RequestAttributes.SCOPE_SESSION));
}
}
...
@RequestMapping("/myHomePage")
public ModelAndView show() {
UserSecurityContext ctx = SecurityContextHolder.currentSecurityContext();
}
Para preocupaciones transversales como la seguridad, este enfoque es mejor porque no necesita modificar las firmas de su controlador.
Sí tu puedes.
@SessionAttributes("userSecurityContext")
public class UserSecurityContext {
}
@RequestMapping("/myHomePage")
public String show(@ModelAttribute("userSecurityContext") UserSecurityContext u) {
// code goes here.
}
Ver para más detalles: