Saltar al contenido

Cómo usar los atributos de sesión en Spring-mvc

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:

  1. 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");
    
  2. Haga que su sesión de controlador tenga un alcance

    @Controller
    @Scope("session")
    
  3. 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.

  4. 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 @ModelAttributeLos 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;
    }

}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *