Comment utiliser les attributs Session au printemps-mvc

pourriez-vous m'aider à écrire l'analogique de ce code?

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

et comment ajouter un élément annoté par @ModelAttribute annotation à la session et y accéder?

86
demandé sur BalusC 2013-09-13 21:05:58

9 réponses

si vous voulez supprimer un objet après chaque réponse pas besoin de session,

si vous voulez garder l'objet pendant la session de l'utilisateur , Il y a plusieurs façons:

  1. ajouter directement un attribut à 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 bof contrôleur comme ceci :

    ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
    
  2. Faire de votre contrôleur de session étendue

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

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

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

       @Autowired
       private User user
    

    qui garde la classe en session.

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

    injecter ensuite la classe dans chaque contrôleur qui vous voulez

    @Autowired
    private User user
    

5.Passer la session à la méthode:

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

6.Faites ModelAttribute en 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 un avantage et un inconvénient:

@session peut utiliser plus de mémoire dans les systèmes de nuages il copie session à tous les noeuds, et la méthode directe (1 et 5) a une approche désordonnée, il n'est pas bon de tester à l'unité.

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>
150
répondu Ali.Mojtehedy 2017-05-01 13:29:53

Utiliser @SessionAttributes

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

" comprendre les attributs du modèle et de la Session MVC du ressort "donne également un très bon aperçu des sessions MVC du ressort et explique comment/quand @ModelAttribute s sont transférés 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 des attributs directement sur la session HTTPS, car cela aide MVC à être vue-agnostique.

37
répondu Heinrich Filter 2013-11-27 09:02:45

SessionAttribute l'annotation est la plus simple et la plus simple au lieu d'obtenir la session à partir de l'objet de la requête et de l'attribut de réglage. N'importe quel objet peut être ajouté au model dans le controller et il sera stocké en session si son nom correspond à l'argument dans l'annotation @SessionAttributes . Ci-dessous, par exemple, personObj sera disponible en session.

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

}
24
répondu Amar 2016-09-01 13:05:13

le code annoté ci-dessous indiquerait "valeur" à" nom

@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 dans L'utilisation JSP ${sessionScope.name} .

pour le @ModelAttribute voir ce link

19
répondu aksappy 2017-05-23 12:18:26

N'est-ce pas plus facile et le plus court de cette façon? Je le savais et je l'ai juste testé-travailler parfait ici:

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

p. S. je suis venu ici à la recherche d'une réponse de " comment utiliser les attributs de Session au printemps-mvc ", mais j'en ai lu tellement sans voir le plus évident que j'avais écrit dans mon code. Je ne l'ai pas vu, alors j'ai pensé que c'était mal, mais non. Donc permet de partager ce que l' connaissance avec la solution la plus facile pour la question principale.

1
répondu strash 2017-04-22 17:26:31

essayez ceci...

@Controller
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit")
@SessionAttributes("pet")
public class EditPetForm {

    @ModelAttribute("types")

    public Collection<PetType> populatePetTypes() {
        return this.clinic.getPetTypes();
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("pet") Pet pet, 
            BindingResult result, SessionStatus status) {
        new PetValidator().validate(pet, result);
        if (result.hasErrors()) {
            return "petForm";
        }else {
            this.clinic.storePet(pet);
            status.setComplete();
            return "redirect:owner.do?ownerId="
                + pet.getOwner().getId();
        }
    }
}
1
répondu R Palanivel-Tamilnadu India 2018-01-22 10:32:04

quand j'ai essayé mon login (qui est un modal bootstrap), j'ai utilisé l'annotation @sessionattributes. Mais le problème était quand la vue est une redirection ("redirect:/home"), les valeurs que j'ai entrées aux expositions de session dans l'url. Certaines sources Internet suggèrent de suivre http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting mais j'ai utilisé le HttpSession à la place. Cette session sera là jusqu'à ce que vous fermez le navigateur. Voici un exemple de code

        @RequestMapping(value = "/login")
        @ResponseBody
        public BooleanResponse login(HttpSession session,HttpServletRequest request){
            //HttpServletRequest used to take data to the controller
            String username = request.getParameter("username");
            String password = request.getParameter("password");

           //Here you set your values to the session
           session.setAttribute("username", username);
           session.setAttribute("email", email);

          //your code goes here
}

on ne change rien de précis du côté de la vue.

<c:out value="${username}"></c:out>
<c:out value="${email}"></c:out>

après l'ouverture de session, ajoutez les codes ci-dessus à n'importe quel endroit de votre site web. Si la session est correctement définie, vous verrez les valeurs qui s'y trouvent. Assurez - vous que vous avez correctement ajouté les balises jstl et El-expressions (voici le lien pour définir les balises jstl ) https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-correctly / )

0
répondu Menuka Ishan 2016-10-26 04:30:48

utiliser cette méthode très simple facile à utiliser

HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();

                                                            request.getSession().setAttribute("errorMsg", "your massage");

dans jsp une fois utiliser, puis supprimer

<c:remove var="errorMsg" scope="session"/>      
0
répondu Bachas 2018-01-03 12:55:56

in Spring 4 Web MVC. Vous pouvez utiliser @SessionAttribute dans la méthode avec @SessionAttributes dans le niveau de contrôleur

@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {

    GetMapping("/showOrder")
    public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
     // method body
}
0
répondu sendon1982 2018-01-11 02:43:19