Spring store object in session

后端 未结 4 1456
醉梦人生
醉梦人生 2020-12-04 09:15

I would like to implement a shopping cart with Spring, so I need to save an object Cart ( which has attributes like products, paymentType and deliveryType ) in

相关标签:
4条回答
  • 2020-12-04 09:24
    @Component
    @Scope("session")
    public class Cart { .. }
    

    and then

    @Inject
    private Cart cart;
    

    should work, if it is declared in the web context (dispatcher-servlet.xml). An alternative option is to use the raw session and put your cart object there:

    @RequestMapping(..)
    public String someControllerMethod(HttpSession session) {
        session.setAttribute(Constants.CART, new Cart());
        ...
        Cart cart = (Cart) session.getAttribute(Constants.CART);
    }
    
    0 讨论(0)
  • 2020-12-04 09:39

    If you are injecting the shopping cart directly into your controller, the issue is likely happening because your controller is singleton scoped (by default), which is wider scope than the bean you're injecting. This excellent article gives an overview of four approaches to exactly what you're trying to do: http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html.

    Here's a quick summary of solutions:

    1. Scope the controller to session scope (use @scope("session") on controller level) and just have a shopping cart instance in the controller.
    2. Scope the controller to request and have session-scoped shopping cart injected.
    3. Just use the session directly - kind of messy, IMO.
    4. Use Spring's annotation <aop:scoped-proxy/>.

    All of the methods have their pros and cons. I usually go with option 2 or 4. Option 4 is actually pretty simple and is the only approach I have seen documented by Spring.

    0 讨论(0)
  • 2020-12-04 09:42

    try to autowired HttpSession and spring will injects in a proxy to the HttpSession @Autowired private HttpSession httpSession;

    0 讨论(0)
  • 2020-12-04 09:45

    You just need to add Scope annotation as below with session and proxy mode

    @Component
    @Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
    public class ShoppingCart implements Serializable{
    }
    

    Where ever you need to use shopping cart object, you can autowire it

    @Service
    public class ShoppingCartServiceImpl implements ShoppingCartService {
        Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class);
    
    
        @Autowired
        ShoppingCart shoppingCart;
    }
    

    Disclosure: I have developed a sample project, which uses spring MVC, angularJS and bootstrap that demonstrate Spring Session scope -
    https://github.com/dpaani/springmvc-shoppingcart-sample

    0 讨论(0)
提交回复
热议问题