如何在spring应用程序中为会话添加属性



我有一个在线商店的应用程序。我希望每个用户创建他们自己的购物篮,他们可以在其中放置一些产品。之后,他可以编辑这个篮子,等等。最好的方法是什么?我在这里已经问过这个问题了,但是没有合适的答案。我搜索了关于这个问题的信息,但也找不到我需要的形式。

我目前使用以下方案
一旦用户访问我的网站,我就为他创建一个购物车,并像这样添加到会话中:

@GetMapping("/")
    public String sayHello(HttpSession session) {
        session.setAttribute("bucket", new ArrayList<ProductDto>());
        return "index";
    }

要向购物车添加东西,我使用以下方法:

@GetMapping("/add/{id}")
    public String addProductToBucket(@SessionAttribute("bucket")ArrayList<ProductDto> bucket,
                                     @PathVariable("id") long id,
                                     Model model){
        bucket.add(productService.getById(id));
        return "redirect:/product";
    }

清空购物车,我只需要写

bucket.clear ();

我做的每件事都对吗?还是我需要做不同的工作?另一个问题。如何在会话中设置该对象的生存期?我想让他有条件地在那里住20分钟

下面的注释代码将设置"value"以"item"

@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
   request.getSession().setAttribute("item",value);
   return "index.html";
}

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

//directly add one attribute to the session
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
   ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
   return "testJsp";
}
 //get it from the controller
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
Make your controller session scoped

//Scope the Objects, for example, you have a user object that should be in session every time
@Component
@Scope("session")
public class User
 {
    String user;
    /*  setter getter*/
  }
//inject class in each controller that you want.
   @Autowired
   private User user
//The AOP proxy injection : in 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>

//Pass HttpSession to method
 String index(HttpSession session) {
            session.setAttribute("mySessionAttribute", "someValue");
            return "index";
        }
//Make ModelAttribute in session By @SessionAttributes("ShoppingCart"):
  public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status  by sessionStatus.setComplete();
}
//or you can add Model To entire Controller Class like,
@Controller
    @SessionAttributes("ShoppingCart")
    @RequestMapping("/req")
    public class MYController {
        @ModelAttribute("ShoppingCart")
        public Visitor getShopCart (....) {
            return new ShoppingCart(....); //get From DB Or Session
        }  
      }

首先,通过添加@Scope("session")来确定控制器会话的作用域。

@Controller
@Scope("session")

然后添加一个属性到会话

@RequestMapping(method = RequestMethod.GET)
public String sayHello(HttpServletRequest request){
  request.getSession().setAttribute("cart",valueOfCart);
    return "index";
}

在应用程序中表示会话超时。属性设置属性server.session。Timeout = value以秒为单位

then Scope用户对象,每次都应该在会话中

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

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

@Autowired
   private User user

最新更新