@SessionAttribute 会话数据业务场景案例
@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