Spring 3.0 ustaw i pobierz atrybut sesji

Chcę odczytać obiekt domain (UserVO) z zakresu sesji.

Ustawiam UserVO w kontrolerze o nazwie WelcomeController

@Controller
@RequestMapping("/welcome.htm")
public class WelcomeController {
@RequestMapping(method = RequestMethod.POST)
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){
      User user = loginService.loginUser(loginCredentials);
     session.setAttribute("user", user);
         return "loginSuccess";
    }
}

Jestem w stanie używać obiektu na stronach jsp <h1>${user.userDetails.firstName}</h1>

Ale nie jestem w stanie odczytać wartości z innego kontrolera,

Próbuję odczytać atrybut sesji w następujący sposób:

@Controller
public class InspectionTypeController {
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST )
 public String addInspectionType(InspectionType inspectionType, HttpSession session)
 {
           User user = (User) session.getAttribute("user");
           System.out.println("User: "+ user.getUserDetails().getFirstName);

        }
} 
Author: tangens, 2010-02-09

4 answers

Pokazany kod powinien działać - HttpSession jest współdzielony między kontrolerami i używasz tej samej nazwy atrybutu. Więc coś innego idzie nie tak, czego nam nie pokazujesz.

Jednakże, niezależnie od tego, czy to działa, czy nie, Spring zapewnia bardziej eleganckie podejście do przechowywania obiektów modelu w sesji, używając adnotacji @SessionAttribute (Zobacz docs).

Na przykład (nie testowałem tego, ale daje pomysł):

@Controller
@RequestMapping("/welcome.htm")
@SessionAttributes({"user"})
public class WelcomeController {
    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(ModelMap modelMap){
       User user = loginService.loginUser(loginCredentials);
       modelMap.addtAttribute(user);
       return "loginSuccess";
    }
}

Oraz then

@Controller
@SessionAttributes({"user"})
public class InspectionTypeController {

   @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST )
   public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) {
      System.out.println("User: "+ user.getUserDetails().getFirstName);
   }
} 

Jednakże, jeśli twój oryginalny kod nie działa, to również nie zadziała, ponieważ coś innego jest nie tak z Twoją sesją.

 40
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 02:57:38

@ SessionAttributes działa tylko w kontekście konkretnej obsługi, więc atrybut ustawiony w WelcomeController będzie widoczny tylko w tym kontrolerze.

 6
Author: karpaczio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 12:15:26

Użyj klasy nadrzędnej do dziedziczenia wszystkich kontrolerów i użyj tam SessionAttributes. Tylko, że ta klasa powinna być w skanowaniu pakietu mvc.

 2
Author: Shrirang Edgaonkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-26 08:20:15

Być może nie ustawiłeś swojego UserVO jako Serializowalnego.

 0
Author: Anil Bhargava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-01 11:45:19