http://cart.gulimall.com/addCartItem?skuId=1&num=2
这个请求发出后,后台执行加购逻辑,如果直接返回success页面。
@GetMapping(value = "/addCartItem")
public String addToCart() {
return "success";
}
http://cart.gulimall.com/addCartItem?skuId=1&num=2
用户刷新浏览器,就会提交一个加购请求。
会导致一个问题,如果用户刷新这个页面,就会重复提交加购请求,这个商品会被重复加购,导致不好的客户体验。
具体的逻辑是这样:
代码如下。
@GetMapping(value = "/addCartItem")
public String addCartItem(@RequestParam("skuId") Long skuId,
@RequestParam("num") Integer num,
RedirectAttributes attributes) throws ExecutionException, InterruptedException {
cartService.addToCart(skuId,num);
attributes.addAttribute("skuId",skuId);
return "redirect:http://cart.gulimall.com/addToCartSuccessPage.html";
}
/**
* 跳转到添加购物车成功页面
* @param skuId
* @param model
* @return
*/
@GetMapping(value = "/addToCartSuccessPage.html")
public String addToCartSuccessPage(@RequestParam("skuId") Long skuId,
Model model) {
//重定向到成功页面。再次查询购物车数据即可
CartItemVo cartItemVo = cartService.getCartItem( );
model.addAttribute("cartItem",cartItemVo);
return "success";
}
http://cart.gulimall.com/addCartItem?skuId=1&num=2
用户刷新浏览器,就会提交一个加购请求。
http://cart.gulimall.com/addToCartSuccessPage.html?skuId=1
用户刷新页面,并不会导致加购的重复提交。
RedirectAttributes 是一个用于向重定向的目标 URL 传递数据的工具。它允许在重定向时将属性添加到模型中,这些属性可以在重定向的目标控制器中通过 @ModelAttribute
或 @RequestParam
注解接收。
在这种情况下,RedirectAttributes
用来传递 skuId
,以便在下一个页面中查询并展示购物车项的具体信息。
使用 RedirectAttributes
避免了表单重复提交的问题,因为浏览器会对相同的 GET 请求进行缓存,而重定向请求会生成一个新的请求,因此不会触发重复提交。
这段代码展示了如何处理购物车商品添加的请求,并防止重复提交。这里采用了一种结合重定向和 RedirectAttributes
的方式来解决这个问题。下面是详细的解释:
addCartItem
方法addToCartSuccessPage
方法处理重定向请求:
skuId
参数。cartService.getCartItem(skuId)
方法获取相应的购物车项信息。CartItemVo
对象添加到模型中,以便在成功页面展示商品信息。返回视图:
"success"
,这通常对应于一个 JSP 或 Thymeleaf 模板文件,用于展示添加成功的页面。RedirectAttributes
的作用RedirectAttributes
是一个用于向重定向的目标 URL 传递数据的工具。它允许你在重定向时将属性添加到模型中,这些属性可以在重定向的目标控制器中通过 @ModelAttribute
或 @RequestParam
注解接收。RedirectAttributes
用来传递 skuId
,以便在下一个页面中查询并展示购物车项的具体信息。RedirectAttributes
避免了表单重复提交的问题,因为浏览器会对相同的 GET 请求进行缓存,而重定向请求会生成一个新的请求,因此不会触发重复提交。除了上述的重定向方案外,还有几种常见的防止重复提交的方法:
Token 方案:
Post/Redirect/Get 方案:
前端禁用按钮:
使用时间戳:
使用状态码:
基于 Session 的解决方案:
课程采用了第二种防止重复提交的方法。
针对这个场景,还可以采用第一种方法:
还可以使用第五种方法
:
因篇幅问题不能全部显示,请点此查看更多更全内容