SessionStatusMethodArgumentResolver 购物业务场景说明

SessionStatusMethodArgumentResolver 用于处理 @SessionAttributesSessionStatus 的参数解析器。它通常用于在表单提交后清理会话属性,或者在跨多个请求的过程中管理会话状态。

业务场景:

假设你正在开发一个在线购物网站,用户可以浏览商品、添加商品到购物车、选择商品数量,并最终下单。在这个过程中,你可能需要在用户会话中存储购物车信息,并在用户完成购买后清理这些信息。

1. 定义购物车模型:

java 复制代码
public class ShoppingCart {
    private Map<Long, Integer> items = new HashMap<>();

    // 标准的 getter 和 setter
    public void addItem(Long productId, int quantity) {
        items.put(productId, quantity);
    }

    public Map<Long, Integer> getItems() {
        return items;
    }
}

2. 创建控制器处理购物车:

java 复制代码
import org.springframework.web.bind.annotation.*;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
@RequestMapping("/cart")
public class ShoppingCartController {

    @ModelAttribute("cart")
    public ShoppingCart cart() {
        return new ShoppingCart();
    }

    @PostMapping("/add/{productId}")
    public String addToCart(@RequestParam("quantity") int quantity,
                            @PathVariable Long productId,
                            @SessionAttribute("cart") ShoppingCart cart,
                            RedirectAttributes redirectAttributes) {
        cart.addItem(productId, quantity);
        redirectAttributes.addFlashAttribute("message", "Product added to cart");
        return "redirect:/cart";
    }

    @GetMapping
    public String showCart(Model model, @SessionAttribute("cart") ShoppingCart cart) {
        model.addAttribute("cart", cart);
        return "cart";
    }

    @PostMapping("/checkout")
    public String checkout(@SessionAttribute("cart") ShoppingCart cart,
                             SessionStatus status) {
        // 处理结账逻辑,保存订单等
        status.setComplete(); // 清理购物车会话属性
        return "checkout";
    }
}

在这个控制器中,addToCart 方法用于添加商品到购物车,showCart 方法用于显示购物车中的商品列表,checkout 方法用于处理结账流程,并在完成购买后调用 SessionStatussetComplete() 方法来清理会话中的购物车属性。

3. 配置 SessionAttributes

java 复制代码
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new SessionStatusMethodArgumentResolver());
    }
}

在这个配置类中,我们添加了 SessionStatusMethodArgumentResolver 到 MVC 配置中,这样 Spring 就能够自动解析 SessionStatus 类型的参数。

4. 视图模板:

cart.html - 显示购物车内容:

html 复制代码
<table>
    <tr>
        <th>Product ID</th>
        <th>Quantity</th>
    </tr>
    <c:forEach var="entry" items="${cart.items}">
        <tr>
            <td>${entry.key}</td>
            <td>${entry.value}</td>
        </tr>
    </c:forEach>
</table>

checkout.html - 结账页面:

html 复制代码
<form action="/cart/checkout" method="post">
    <button type="submit">Checkout</button>
</form>

总结:

  • SessionStatusMethodArgumentResolver 允许开发者在控制器方法中使用 SessionStatus 对象来管理会话状态。
  • 它提供了一种机制来清理会话属性,例如在用户完成操作后不需要再保留的数据。
  • 使用 SessionStatus 可以简化会话管理,避免内存泄漏,并提高应用程序的健壮性。
相关推荐
qcx233 分钟前
深度解析Deepseek V4:1M 上下文不是军备竞赛,是养 Agent 的人才知道的痛
java·开发语言
小则又沐风a5 分钟前
基础的开发工具(2)---Linux
java·linux·前端
字节高级特工7 分钟前
MySQL数据库基础与实战指南
数据库·c++·人工智能·后端·mysql·adb
晨非辰8 分钟前
吃透C++两大默认成员函数:const成员函数、 & 取地址运算符重载
java·大数据·开发语言·c++·人工智能·后端·面试
humcomm14 分钟前
全栈开发技术栈的最新进展(2026年视角)
开发语言·架构
梵得儿SHI14 分钟前
(第三篇)Spring AI 架构设计与优化:容器化与云原生部署,基于 K8s 的 AI 应用全生命周期管理
java·ci/cd·docker·云原生·kubernetes·容器化·spring ai
普修罗双战士15 分钟前
项目设计-文章系统发布文章完整前后端设计
java·数据库·vue.js·spring boot·git·intellij-idea
鹏程十八少17 分钟前
11. 2026金三银四 能答对这 29 道题,你的 Android 插件化就算真正通关了
前端·后端·面试
一切皆是因缘际会18 分钟前
大模型幻觉深度解析:成因、落地危害与工程级解决方案
大数据·人工智能·深度学习·安全·ai·架构
YangWeiminPHD20 分钟前
金水明32051指令集架构
架构·51单片机·指令集