如何更新Spring MVC Web应用程序中的会话属性

时间:2014-07-18 08:02:38

标签: java spring session spring-mvc

我通过org.springframework.web.bind.annotation.SessionAttributes在结帐流程中将购物车实例存储在会话变量中:

@SessionAttributes({"shoppingCart"})
public class CheckoutController { ... }

但是,当结帐流程完成后,我想在会话中存储一个全新的ShoppingCart实例。

我需要类似的东西:

sessionAttributes.set("shoppingCart", new ShoppingCart());

我可以使用哪种方法来完成此任务?

3 个答案:

答案 0 :(得分:3)

如果您可以访问HttpServletRequest,请尝试使用此

request.getSession().setAttribute("shoppingCart", new ShoppingCart());

答案 1 :(得分:1)

您只需使用Model来覆盖此内容:

public String method(Model model) {
    model.addAttribute("shoppingCart", new ShoppingCart());
    ....
}

另一个选项是将SessionStatus接口添加到方法参数中。它有清理会话属性的方法:

public String method(SessionStatus sessionStatus) {
    sessionStatus.setComplete();
    ....
}

答案 2 :(得分:0)

感谢您的回答。 最后我用以下方式解决了这个问题: 我有一个基础控制器,用于所有与结账相关的控制器,在创建新会话时填充购物车:

@SessionAttributes({"shoppingCart"})
public class CheckoutController {

  @ModelAttribute("shoppingCart")
  public ShoppingCart populateSessionShoppingCart() {
    // populates the cart for the first time if its null
    return new ShoppingCart();
  }
}

在完成结账过程的控制器中,我使用以下方法:

@Controller
public class PaymentController extends CheckoutController {

  @RequestMapping(value = "/final_page", method = RequestMethod.GET)
  public String finalPage(Map<String, Object> model) {
    model.put("shoppingCart", new ShoppingCart());
    return "final_page";
  }
}

行:model.put(“shoppingCart”,new ShoppingCart());在会话中重置购物车。

注意:此方法仅使用spring会话处理,当然也会使用底层的HttpSession。 spring如何在内部处理会话处理,是一个内部弹簧实现细节,与上面的代码无关。