Come utilizzare gli attributi di sessione in Spring-mvc

Potresti aiutarmi a scrivere analogici in stile mvc primaverile di questo codice?

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

E come aggiungere un elemento annotato da @ModelAttribute annotazione alla sessione e quindi accedervi?

Se si desidera eliminare l’object dopo ogni risposta, non è necessario eseguire la sessione,

Se vuoi mantenere l’object durante la sessione utente, ha alcuni modi:

  1. aggiungi direttamente un attributo alla sessione:

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

    e puoi ottenerlo dal controller in questo modo:

     ShoppingCart cart = (ShoppingCart)session.getAttribute("cart"); 
  2. Rendi ambito il tuo controller

     @Controller @Scope("session") 
  3. Portare gli oggetti, ad esempio, hai l’object utente che vuoi essere in sessione ogni volta:

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

    quindi iniettare class in ogni controller che si desidera

      @Autowired private User user 

    che mantengono la lezione in sessione.

  4. L’iniezione proxy AOP: in spring -xml:

          

    quindi iniettare class in ogni controller che si desidera

     @Autowired private User user 

5. Passare HttpSession al metodo:

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

6. Make ModelAttribute in sessione Da @SessionAttributes (“ShoppingCart”):

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

oppure è ansible aggiungere il modello a tutta la class del controller

 @Controller @SessionAttributes("ShoppingCart") @RequestMapping("/req") public class MYController { @ModelAttribute("ShoppingCart") public Visitor getShopCart (....) { return new ShoppingCart(....); //get From DB Or Session } } 

ognuno ha vantaggio e svantaggio:

@session può usare più memoria nei sistemi cloud, copia la sessione su tutti i nodes, e il metodo diretto (1 e 5) ha un approccio disordinato, non va bene al test unitario.

Per accedere alla sessione jsp

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

in Jstl:

  

in Thymeleaf:

 

.

Usa @SessionAttributes

Vedi i documenti: Utilizzo di @SessionAttributes per archiviare gli attributi del modello nella sessione HTTP tra le richieste

” Comprensione degli attributi di Spring MVC Model And Session ” offre anche un’ottima panoramica delle sessioni di Spring MVC e spiega come / quando @ModelAttribute vengono trasferiti nella sessione (se il controller è @SessionAttributes annotazioni).

Questo articolo spiega anche che è meglio usare @SessionAttributes sul modello invece di impostare gli attributi direttamente su HttpSession perché ciò aiuta Spring MVC ad essere indipendente dalla vista.

SessionAttribute annotazione SessionAttribute è la più semplice e semplice invece di ottenere la sessione dall’object richiesta e dall’attributo di impostazione. Qualsiasi object può essere aggiunto al modello nel controller e verrà memorizzato in sessione se il suo nome corrisponde all’argomento nell’annotazione @SessionAttributes . Di seguito, ad esempio, personObj sarà disponibile in sessione.

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

Il codice sotto annotato imposterà “valore” in “nome”

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

Per accedere allo stesso in JSP usa ${sessionScope.name} .

Per @ModelAttribute vedi questo link

Quando provo il mio login (che è un modal bootstrap), ho usato l’annotazione @sessionattributes. Ma il problema era quando la vista è un reindirizzamento (“reindirizzamento: / home”), i valori che ho inserito nella sessione mostrano nell’URL. Alcune fonti Internet suggeriscono di seguire http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting, ma ho usato invece HttpSession. Questa sessione sarà lì finché non chiuderai i browser. Ecco un codice di esempio

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

Non si modifica la cosa specifica sul lato vista.

   

Dopo l’accesso aggiungi sopra i codici per qualsiasi luogo nel tuo sito web. Se la sessione è impostata correttamente, vedrai i valori lì. Assicurati di aver aggiunto correttamente i tag jstl e le espressioni El (questo è il link per impostare i tag jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project- correttamente / )

Non è più facile e più breve in questo modo? Lo sapevo e l’ho appena testato – funziona perfettamente qui:

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

ps Sono venuto qui alla ricerca di una risposta a ” Come usare gli attributi di sessione in Spring-mvc “, ma ne ho letti tanti senza vedere il più ovvio che avevo scritto nel mio codice. Non l’ho visto, quindi ho pensato che fosse sbagliato, ma non lo era. Quindi condividiamo questa conoscenza con la soluzione più semplice per la domanda principale.

Prova questo…

 @Controller @RequestMapping("/owners/{ownerId}/pets/{petId}/edit") @SessionAttributes("pet") public class EditPetForm { @ModelAttribute("types") public Collection 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(); } } } 

Usa questo metodo molto semplice e facile da usare

 HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest(); request.getSession().setAttribute("errorMsg", "your massage"); 

in jsp una volta usato poi rimuovi

  

In spring 4 Web MVC. Puoi utilizzare @SessionAttribute nel metodo con @SessionAttributes nel livello Controller

 @Controller @SessionAttributes("SessionKey") public class OrderController extends BaseController { GetMapping("/showOrder") public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) { // method body }