likes
comments
collection
share

@SessionAttribute 会话数据业务场景案例

作者站长头像
站长
· 阅读数 56

@SessionAttribute 注解用于从 HTTP 会话(Session)中绑定属性到控制器方法的参数。这允许数据在多个请求之间保持,非常适合用于需要跨页面访问的数据,如用户认证信息、购物车内容等。

业务场景:

例如开发一个需要用户登录的 Web 应用程序,用户在登录后可以访问其个人资料页面。此外,用户可能希望在浏览网站时添加商品到购物车,而这些商品信息需要在用户会话中持续保存。

1. 用户登录并设置会话属性:

@Controller
public class LoginController {

    @PostMapping("/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        @ModelAttribute("loginStatus") LoginStatus loginStatus,
                        SessionStatus sessionStatus,
                        Model model) {
        // 假设验证逻辑通过
        sessionStatus.setComplete(); // 登录成功后清理 session 属性
        model.addAttribute("username", username); // 将用户名添加到模型
        return "redirect:/profile";
    }
}

2. 使用 @SessionAttribute 注解访问会话中的属性:

@Controller
public class ProfileController {

    @GetMapping("/profile")
    public String showProfile(@SessionAttribute("username") String username, Model model) {
        model.addAttribute("username", username); // 将用户名添加到模型
        return "profile"; // 返回包含用户名的视图
    }
}

在这个控制器中,@SessionAttribute("username") 注解用于从会话中获取名为 username 的属性,并将其绑定到控制器方法的参数上。

3. 购物车功能:

@Controller
public class ShoppingCartController {

    @GetMapping("/cart")
    public String showCart(@SessionAttribute("cart") ShoppingCart cart, Model model) {
        if (cart == null) {
            cart = new ShoppingCart();
            model.addAttribute("cart", cart); // 如果购物车不存在,则创建一个新的
        }
        return "cart"; // 返回购物车视图
    }

    @PostMapping("/cart/add/{productId}")
    public String addToCart(@PathVariable Long productId, @SessionAttribute("cart") ShoppingCart cart) {
        cart.addItem(productId); // 将商品添加到购物车
        return "redirect:/cart"; // 重定向回购物车页面
    }
}

在这个例子中,@SessionAttribute("cart") 注解用于从会话中获取购物车对象。如果会话中不存在购物车对象,它将返回 null,此时你可以创建一个新的购物车对象并添加到模型中。

4. 视图模板:

profile.html - 用户个人资料页面:

<h1>Welcome, ${username}!</h1>
<!-- 用户个人资料的其他内容 -->

cart.html - 购物车页面:

<h2>Your Cart</h2>
<ul>
    <c:forEach var="item" items="${cart.items}">
        <li>${item.productId} - ${item.name}</li>
    </c:forEach>
</ul>
<!-- 购物车操作的其他内容 -->

总结

  • @SessionAttribute 使得开发者能够轻松地从会话中读取和操作数据,简化了会话管理。
  • 它支持在用户会话期间保持数据状态,提高了用户体验。
  • 使用 @SessionAttribute 可以避免在每个请求中重复创建或查询数据,减少了数据库访问次数和服务器负载。
转载自:https://juejin.cn/post/7383029698114224179
评论
请登录