当前位置: 首页 > 知识库问答 >
问题:

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

唐兴思
2023-03-14

你能帮我编写此代码的Spring mvc风格模拟吗?

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

如何向会话添加由@modeltribute注释注释的元素,然后访问它?

共有3个答案

裴卓君
2023-03-14

< code>SessionAttribute批注是最简单直接的方法,而不是从请求对象获取会话并设置属性。任何对象都可以添加到控制器中的模型中,如果其名称与< code>@SessionAttributes批注中的参数匹配,它将存储在会话中。在下面的示例中,< code>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;
    }

}
屠和洽
2023-03-14

使用< code>@SessionAttributes

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

“理解Spring MVC模型和会话属性”也很好地概述了Spring MVC会话,并解释了如何/何时将< code>@ModelAttribute转移到会话中(如果控制器带有< code>@SessionAttributes注释)。

那篇文章还解释了最好在模型上使用@Session属性,而不是直接在Http会话上设置属性,因为这有助于Spring MVC与视图无关。

颜经艺
2023-03-14

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

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

>

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

    @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");
    

    将控制器会话设为作用域

    @Controller
    @Scope("session")
    

    范围对象,例如您有每次都应该在会话中的用户对象:

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

    然后将类注入到所需的每个控制器中

       @Autowired
       private User user
    

    使课堂保持在会话中。

    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>
    

    然后将类注入到所需的每个控制器中

    @Autowired
    private User user
    

    5.将HttpSession传递给方法:

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

    6.通过@SessionAttributes(“购物车”)在会话中进行模型归因:

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

    每个都有优点和缺点:

    @session在云系统中可能会使用更多的内存,它将session复制到所有节点,而直接方法(1和5)的方法比较混乱,不利于单元测试。

    访问会话jsp

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

    在Jstl中:

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

    在Thymeleaf:

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

  •  类似资料:
    • 在我的项目中,我使用spring security。要获取当前用户名,我正在访问SpringContextHolder 使用对象我只能检索到有限的信息,如用户名、密码、角色等。如果我想检索用户ID怎么办?我是否需要每次都进行数据库调用以获取更多与用户名对应的用户详细信息?我不能为会话对象设置属性吗?在大部分帖子中,解决方案是通过使用对象提出的。但在我的情况下,我不需要视图层的Session属性,但

    • 成功登录后,我想用新的url继续进行进一步的请求处理。但url正在调用springmvc中的公开服务,其中的安全配置不会检查会话身份验证以获取传入url。请看下面的代码。 当jsp页面提交登录验证时,J_security_check调用目标url,该URL随后调用拦截器模式/home*并验证登录凭证。 如果我在登录之前调用公开的服务“/address/userid/”,它将直接调用服务方法,使其成

    • 问题内容: 简而言之,我想要的是: 代替 主要是为了: 可读性 单元测试 问题答案: 我找到了解决方案。 我们的想法是注册自定义的,它可以处理一个自定义的注释- (或)。 如果未指定,则可以使用其中张贴的代码的注释。

    • 我有一个Spring MVC Web应用程序,用户可以在该应用程序上登录和注册帐户。一旦用户登录并且用户注销会话结束,我将尝试保留会话。 实现这一点的最佳方式是什么? 以下是我的登录控制器。

    • 我的spring MVC项目有一个问题。在我的本地机器上,我的项目运行时没有在spring security中配置SSL,表单提交工作良好。但如果启用SSL并将项目上载到服务器,则在每个表单上提交以下异常: 我不知道瓦茨在这里出了问题。登录和普通的get请求可以工作,但是如果我提交了一个带有会话属性的表单,我会得到这个异常。 这将是很好的,得到一些提示,在那里我可以研究我的问题。

    • 我正在开发一个使用Spring框架和Hibernate作为ORM的Web应用程序。我想创建一个注册和登录页面。登录时,应为特定用户创建会话(例如发送cookie等)。由于我是Spring的新手,我不知道如何完成这项工作。有人可以给我一个很好的教程吗?谢谢!