如何在Spring-mvc中使用会话属性

你能帮我写这个代码的springmvc风格的模拟?

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

以及如何将由@ModelAttribute注释注释的元素添加到会话中,然后访问它?

如果要在每个响应之后删除对象,则不需要进行会话,

如果你想在用户会话期间保持对象,它有一些方法:

  1. 直接向会话添加一个属性:

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

    你可以像这样从控制器中获得它:

     ShoppingCart cart = (ShoppingCart)session.getAttribute("cart"); 
  2. 使您的控制器会话范围

     @Controller @Scope("session") 
  3. 范围的对象,例如你有每次想要在会话中的用户对象:

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

    然后在每个你想要的控制器中注入类

      @Autowired private User user 

    保持上课的课程。

  4. AOP代理注入:在春季-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> 

    然后在每个你想要的控制器中注入类

     @Autowired private User user 

5.通过HttpSession方法:

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

6.在会话中build立ModelAttribute通过@SessionAttributes(“ShoppingCart”):

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

或者你可以添加模型到整个控制器类

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

每个人都有优势和劣势:

在云系统中可能会使用更多的内存将会话复制到所有节点,直接方法(1和5)具有凌乱的方法,unit testing并不好。

访问会话jsp

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

在Jstl:

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

在Thymeleaf:

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

使用@SessionAttributes

请参阅文档: 使用@SessionAttributes在请求之间的HTTP会话中存储模型属性

“ 了解Spring MVC模型和会话属性 ”也给出了Spring MVC会话的非常好的概述,并解释了@ModelAttribute如何被转移到会话中(如果控制器是@SessionAttributes注释的)。

该文章还解释说,最好在模型上使用@SessionAttributes ,而不是直接在HttpSession上设置属性,因为这有助于Spring MVC与视图无关。

SessionAttribute注解是最简单直接的,而不是从请求对象和设置属性获取会话。 任何对象都可以添加到控制器中的模型中,如果名称与@SessionAttributes注释中的参数匹配,它将存储在会话中。 在下面例如, personObj将在会话中可用。

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

下面带注释的代码会将“value”设置为“name”

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

要在JSP中访问相同的文件,使用${sessionScope.name}

对于@ModelAttribute请参阅此链接

当我尝试login(这是引导模式)时,我使用@sessionattributes注释。 但问题是当视图是redirect(“redirect:/ home”),我input到会话中的值显示在url中。 一些Internet源代码build议遵循http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting但是我使用了HttpSession。; 这个会话将在那里,直到你closures浏览器。 这里是示例代码

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

在视图方面你不会改变具体的东西。

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

login后,将以上代码添加到您网站的任何地方。 如果会话正确设置,您将看到那里的值。 确保你正确地添加了jstl标签和El-expression式(这里是链接来设置jstl标签https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-正确/

这不是最简单和最短的吗? 我知道它,只是testing它 – 在这里工作完美:

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

ps 我来到这里寻找“ 如何在Spring-mvc中使用会话属性 ”的答案,但读了很多,却没有看到我在代码中写的最明显的东西。 我没有看到它,所以我认为是错的,但不是。 因此,让我们分享这个知识与主要问题的最简单的解决scheme。

 hi dear try this... @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(); } } }