web-dev-qa-db-fra.com

Comment utiliser les attributs de session dans Spring-mvc

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

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

Et comment ajouter un élément annoté par l'annotation @ModelAttribute à la session, puis y accéder?

94
gstackoverflow

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

Si vous souhaitez conserver l’objet pendant la session utilisateur, il existe différentes manières:

  1. ajoutez 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. Rendez votre session de contrôleur étendue

    @Controller
    @Scope("session")
    
  3. Portée des 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 garde la classe en session.

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

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

    @Autowired
    private User user
    

5.Passe HttpSession à la méthode:

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

6.Make 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 un modèle à toute la classe de 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 en nuage, il copie la session sur tous les nœuds, et la méthode directe (1 et 5) a une approche compliquée, il n'est pas bon de faire des tests unitaires.

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>
173
Ali.Mojtehedy

Utilisez @SessionAttributes

Voir la documentation: tilisation de @SessionAttributes pour stocker les attributs de modèle dans la session HTTP entre les demandes

" Comprendre le modèle et les attributs de session Spring MVC " donne également un très bon aperçu des sessions Spring MVC et explique comment/quand @ModelAttributes 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 plutôt que de définir des attributs directement sur HttpSession, car cela permet à Spring MVC d'être indépendant de la vue.

40
Heinrich Filter

L'annotation SessionAttribute est la plus simple et la plus directe au lieu d'obtenir une session à partir d'un objet de requête et d'un attribut de paramètre. Tout 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 l'annotation @SessionAttributes. En 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;
    }

}
25
Rama

Le code annoté ci-dessous définirait "valeur" sur "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 chose dans JSP, utilisez ${sessionScope.name}.

Pour le @ModelAttribute voir ceci lien

19
aksappy

Essaye ça...

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

N'est-ce pas plus simple et plus court de cette façon? Je le savais et je l'ai juste testé - ç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 de "Comment utiliser les attributs de session dans Spring-mvc", mais j'en ai lu beaucoup sans voir le plus évident dans lequel j'avais écrit mon code. Je ne l'ai pas vu, alors j'ai pensé que c'était faux, mais non, ce n'était pas le cas. Partageons donc ces connaissances avec la solution la plus simple pour la question principale.

1
strash

Lorsque j'essaie de me connecter (ce qui est un modal bootstrap), j'ai utilisé l'annotation @sessionattributes. Mais le problème était lorsque la vue est une redirection ("redirect:/home"), les valeurs que j'ai entrées en session sont affichées 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 plutôt utilisé HttpSession. Cette session sera là jusqu'à la fermeture des navigateurs. 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
}

Vous ne changez pas de chose spécifique du côté de la vue.

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

Après la connexion, ajoutez les codes ci-dessus à n’importe quel endroit de votre site Web. Si la session est correctement définie, vous verrez les valeurs à cet endroit. Assurez-vous que vous avez correctement ajouté les balises jstl et expressions El (Le lien suivant vous permet de définir les balises jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to- vous projetez correctement / )

0
Menuka Ishan

Utilisez 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 enlever

<c:remove var="errorMsg" scope="session"/>      
0
Bachas

Au printemps 4 Web MVC. Vous pouvez utiliser @SessionAttribute dans la méthode avec @SessionAttributes dans le niveau du contrôleur.

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

    GetMapping("/showOrder")
    public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
     // method body
}
0
sendon1982