Solución:
Si desea eliminar el objeto después de cada respuesta, no necesita sesión,
Si desea conservar el objeto durante la sesión del usuario, hay algunas formas:
-
agregue directamente un atributo a la sesión:
@RequestMapping(method = RequestMethod.GET) public String testMestod(HttpServletRequest request){ ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value); return "testJsp"; }
y puedes obtenerlo del controlador de esta manera:
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
-
Haga que su sesión de controlador tenga un alcance
@Controller @Scope("session")
-
Alcance los Objetos, por ejemplo, tiene un objeto de usuario que debería estar en sesión cada vez:
@Component @Scope("session") public class User { String user; /* setter getter*/ }
luego inyecta clase en cada controlador que quieras
@Autowired private User user
que mantiene la clase en sesión.
-
La inyección de proxy AOP: en spring -xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <bean id="user" class="com.User" scope="session"> <aop:scoped-proxy/> </bean> </beans>
luego inyecta clase en cada controlador que quieras
@Autowired private User user
5.Pase HttpSession al método:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6.Haga ModelAttribute en sesión por @SessionAttributes (“ShoppingCart”):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status by sessionStatus.setComplete();
}
o puede agregar el modelo a toda la clase de controlador como,
@Controller
@SessionAttributes("ShoppingCart")
@RequestMapping("/req")
public class MYController {
@ModelAttribute("ShoppingCart")
public Visitor getShopCart (....) {
return new ShoppingCart(....); //get From DB Or Session
}
}
cada uno tiene ventajas y desventajas:
@session puede usar más memoria en los sistemas en la nube; copia la sesión en todos los nodos, y el método directo (1 y 5) tiene un enfoque desordenado, no es bueno para la prueba unitaria.
Para acceder a la sesión jsp
<%=session.getAttribute("ShoppingCart.prop")%>
en Jstl:
<c:out value="${sessionScope.ShoppingCart.prop}"/>
en Thymeleaf:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
Usar @SessionAttributes
Consulte los documentos: Uso de @SessionAttributes para almacenar atributos de modelo en la sesión HTTP entre solicitudes
“Comprender los atributos de sesión y modelo de Spring MVC” también ofrece una muy buena descripción general de las sesiones de Spring MVC y explica cómo y cuándo @ModelAttribute
Los mensajes de correo electrónico se transfieren a la sesión (si el controlador está @SessionAttributes
anotado).
Ese artículo también explica que es mejor usar @SessionAttributes
en el modelo en lugar de establecer atributos directamente en HttpSession porque eso ayuda a Spring MVC a ser independiente de la vista.
SessionAttribute
La anotación es la más simple y directa en lugar de obtener la sesión del objeto de solicitud y el atributo de configuración.
Cualquier objeto se puede agregar al modelo en el controlador y se almacenará en la sesión si su nombre coincide con el argumento en @SessionAttributes
anotación.
A continuación, por ejemplo, personObj
estará disponible en sesión.
@Controller
@SessionAttributes("personObj")
public class PersonController {
@RequestMapping(value="/person-form")
public ModelAndView personPage() {
return new ModelAndView("person-page", "person-entity", new Person());
}
@RequestMapping(value="/process-person")
public ModelAndView processPerson(@ModelAttribute Person person) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("person-result-page");
modelAndView.addObject("pers", person);
modelAndView.addObject("personObj", person);
return modelAndView;
}
}