如何在Spring-mvc中使用Session属性

gst*_*low 100 session servlets spring-mvc

你能帮我写一下这个代码的spring mvc风格模拟吗?

 session.setAttribute("name","value");
Run Code Online (Sandbox Code Playgroud)

以及如何将一个注释@ModelAttribute注释的元素添加到会话中,然后获取对它的访问权限?

Ali*_*edy 181

如果要在每次响应后删除对象,则不需要会话,

如果您想在用户会话期间保留对象,有以下几种方法:

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

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

    你可以从控制器那里得到它:

    ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使控制器会话作用域

    @Controller
    @Scope("session")
    
    Run Code Online (Sandbox Code Playgroud)
  3. 范围对象,例如,您每次都应该在会话中使用用户对象:

    @Component
    @Scope("session")
    public class User
     {
        String user;
        /*  setter getter*/
      }
    
    Run Code Online (Sandbox Code Playgroud)

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

       @Autowired
       private User user
    
    Run Code Online (Sandbox Code Playgroud)

    这使课堂上课.

  4. AOP代理注入:在spring -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>
    
    Run Code Online (Sandbox Code Playgroud)

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

    @Autowired
    private User user
    
    Run Code Online (Sandbox Code Playgroud)

5.Pass HttpSession方法:

 String index(HttpSession session) {
            session.setAttribute("mySessionAttribute", "someValue");
            return "index";
        }
Run Code Online (Sandbox Code Playgroud)

6.通过@SessionAttributes("ShoppingCart")在会话中创建ModelAttribute:

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

或者您可以将模型添加到整个控制器类,如,

@Controller
    @SessionAttributes("ShoppingCart")
    @RequestMapping("/req")
    public class MYController {

        @ModelAttribute("ShoppingCart")
        public Visitor getShopCart (....) {
            return new ShoppingCart(....); //get From DB Or Session
        }  
      }
Run Code Online (Sandbox Code Playgroud)

每个人都有优势和劣势:

@session可能会在云系统中使用更多内存,它会将会话复制到所有节点,而直接方法(1和5)则采用凌乱的方法,单元测试并不好.

访问会话jsp

<%=session.getAttribute("ShoppingCart.prop")%>
Run Code Online (Sandbox Code Playgroud)

在Jstl:

<c:out value="${sessionScope.ShoppingCart.prop}"/>
Run Code Online (Sandbox Code Playgroud)

在Thymeleaf:

<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
Run Code Online (Sandbox Code Playgroud)

  • 3.如果您的控制器是单例,那么您需要为具有会话范围的注入组件定义proxyMode = ScopedProxyMode.TARGET_CLASS.@Scope(value ="session",proxyMode = ScopedProxyMode.TARGET_CLASS) (6认同)

Hei*_*ter 41

使用 @SessionAttributes

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

" 了解Spring MVC模型和会话属性 "还提供了对Spring MVC会话的非常好的概述,并解释了如何/何时将@ModelAttributes转移到会话中(如果控制器已@SessionAttributes注释).

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


Ram*_*ama 26

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

}
Run Code Online (Sandbox Code Playgroud)


aks*_*ppy 19

以下带注释的代码将"值"设置为"名称"

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

在JSP中使用相同的访问权限 ${sessionScope.name}.

For the @ModelAttribute see this link


str*_*ash 5

这样不是最简单和最短吗?我知道并刚刚对其进行了测试 - 在这里工作得很好:

@GetMapping
public String hello(HttpSession session) {
    session.setAttribute("name","value");
    return "hello";
}
Run Code Online (Sandbox Code Playgroud)

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