113 votes

Comment utiliser les attributs de session dans Spring-mvc ?

Pourriez-vous m'aider à écrire l'analogue de ce code dans le style de spring mvc ?

 session.setAttribute("name","value");

Et comment ajouter un élément qui est annoté par @ModelAttribute à la session et ensuite y avoir accès ?

202voto

Ali.Mojtehedy Points 380

Si vous voulez supprimer l'objet après chaque réponse, vous n'avez pas besoin de session,

Si vous voulez conserver l'objet pendant la session de l'utilisateur, Il y a quelques moyens :

  1. ajouter directement un attribut à la session :

    @RequestMapping(method = RequestMethod.GET)
    public String testMestod(HttpServletRequest request){
       ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
       return "testJsp";
    }

    et vous pouvez l'obtenir du contrôleur comme ceci :

    ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
  2. Rendre la session de votre contrôleur scopée

    @Controller
    @Scope("session")
  3. Scope les objets, par exemple vous avez un objet utilisateur qui doit être en session à chaque fois :

    @Component
    @Scope("session")
    public class User
     {
        String user;
        /*  setter getter*/
      }

    puis injecter la classe dans chaque contrôleur que vous voulez

       @Autowired
       private User user

    qui maintient la classe en session.

  4. L'injection de proxy AOP : dans 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>

    puis injecter la classe dans chaque contrôleur que vous voulez

    @Autowired
    private User user

Passer HttpSession à la méthode :

 String index(HttpSession session) {
            session.setAttribute("mySessionAttribute", "someValue");
            return "index";
        }

6.faire ModelAttribute dans la session par @SessionAttributes("ShoppingCart") :

  public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status  by sessionStatus.setComplete();
}

ou vous pouvez ajouter le modèle à la classe entière du contrôleur comme,

@Controller
    @SessionAttributes("ShoppingCart")
    @RequestMapping("/req")
    public class MYController {

        @ModelAttribute("ShoppingCart")
        public Visitor getShopCart (....) {
            return new ShoppingCart(....); //get From DB Or Session
        }  
      }

chacun a des avantages et des inconvénients :

@session peut utiliser plus de mémoire dans les systèmes en nuage, il copie la session sur tous les nœuds, et la méthode directe (1 et 5) a une approche désordonnée, elle n'est pas bonne pour le test unitaire.

Pour accéder à la session jsp

<%=session.getAttribute("ShoppingCart.prop")%>

dans Jstl :

<c:out value="${sessionScope.ShoppingCart.prop}"/>

dans Thymeleaf :

<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>

45voto

Heinrich Filter Points 1253

Utilice @SessionAttributes

Voir les docs : Utilisation de @SessionAttributes pour stocker les attributs du modèle dans la session HTTP entre les requêtes

" Comprendre les attributs de modèle et de session de Spring MVC "donne également un très bon aperçu des sessions Spring MVC et explique comment/quand @ModelAttribute sont transférées dans la session (si le contrôleur est @SessionAttributes annoté).

Cet article explique également qu'il est préférable d'utiliser @SessionAttributes sur le modèle au lieu de définir les attributs directement sur la session Http, car cela permet à Spring MVC d'être agnostique vis-à-vis de la vue.

30voto

Amar Points 1396

SessionAttribute est la plus simple et la plus directe au lieu de récupérer la session à partir de l'objet de la demande et de définir l'attribut. N'importe quel objet peut être ajouté au modèle dans le contrôleur et il sera stocké dans la session si son nom correspond à l'argument dans le champ @SessionAttributes annotation. Dans l'exemple ci-dessous, personObj sera disponible en séance.

@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;
    }

}

19voto

aksappy Points 1871

Le code annoté ci-dessous définit la valeur "value" comme "name".

@RequestMapping("/testing")
@Controller
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
    request.getSession().setAttribute("name", "value");
    return "testJsp";
  }
}

Pour accéder à la même chose en JSP, utilisez ${sessionScope.name} .

Pour le @ModelAttribute voir ceci lien

5voto

strash Points 716

N'est-ce pas plus facile et le plus court de cette façon ? Je le savais et je viens de le tester - ça marche parfaitement ici :

@GetMapping
public String hello(HttpSession session) {
    session.setAttribute("name","value");
    return "hello";
}

p.s. Je suis venu ici pour chercher une réponse à la question " Comment utiliser les attributs de session dans Spring-mvc ? ", mais j'en ai lu tellement sans voir la plus évidente que j'avais écrite dans mon code. Je ne l'ai pas vu, donc j'ai pensé que c'était faux, mais non, ça ne l'était pas. Alors partageons cette connaissance avec la solution la plus simple pour la question principale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X